分享

爬山搜索算法实现

 素行 2007-05-22

这种算法希望找到一条路径, 能够将A地到Z地的航班数搞到最少. 算法使用的启发信息是: 算法认为航线长度越长, 那么接近目标的几率就越大, 于是航班的数量就会越少. AI的角度说, 这叫爬山搜索”.

爬山算法选择看起来最接近目标的节点作为下一步处理的节点. 这里, 改动的是find()方法:

  FlightInfo find(String from)  //找出离出发城市最远的航班

  {

    int pos = -1;

    int dist = 0;

 

    for(int i=0; i < numFlights; i++) {

      if(flights[i].from.equals(from) &&

         !flights[i].skip)

      {

        if(flights[i].distance > dist) {

          pos = i;

          dist = flights[i].distance;

        }

      }

    }

 

    if(pos != -1) {

      flights[pos].skip = true;

      FlightInfo f = new FlightInfo(flights[pos].from,

                           flights[pos].to,flights[pos].distance);

      return f;

    }

 

    return null;

  }

 

 

一般来说, 爬山搜索都能找到比较理想的解, 因为它减少发现目标之前需要访问的节点数. 但是, 这种算法存在3个问题: (这是从人工智能的书上面弄下来的)

1.       存在所谓错误山峰的问题(即局部最优问题), 这会导致大量的回退;

2.       高原问题”: 在这种情况下, 所有下一步节点看起来都是一样的好(or ). 在这种情况先, 爬山搜索和深度优先搜索是一样的;

3.       山脊问题”: 这种情况将导致性能的降低, 因为在回退的时候, 算法会导致多次通过某个山脊.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多