爬山算法的局限性是什么?我们如何才能克服这些限制?
爬山算法的局限性是什么以及如何克服它们?
正如@nbro 已经说过的那样,爬山是一系列本地搜索算法。因此,当您在问题中说爬山时,我假设您在谈论标准的爬山。爬山的标准版本有一些限制,并且经常卡在以下场景中:
- 局部最大值:爬山算法在附近达到局部最大值,被拉向峰值并卡在那里,没有其他地方可去。
- Ridges:这些是局部最大值的序列,使算法难以导航。
- 高原:这是一个平坦的状态空间区域。由于没有上坡路,算法经常在高原上迷路。
为了解决这些问题,已经开发了许多爬山算法的变体。这些是最常用的:
- 随机爬山从上坡动作中随机选择。选择的概率随上坡移动的陡峭程度而变化。
- First-Choice Climbing通过随机生成后继者直到找到更好的后继者来实现上述方法。
- 从随机生成的初始移动中随机重新开始爬山搜索,直到达到目标状态。
爬山算法的成功取决于状态空间景观的架构。只要最大值和高原很少,爬山搜索算法的变体就可以很好地工作。但在现实世界的问题中,有一个景观看起来更像是一个广泛分布在平坦地板上的秃头豪猪家族,每根豪猪的针尖上都住着微型豪猪(如《人工智能:A》一书第 4 章所述)现代方法)。NP-Hard 问题通常有指数数量的局部最大值会被卡住。
给定的算法已经被开发来克服这些类型的问题:
- 受激退火
- 局部波束搜索
- 遗传算法
爬山不是一种算法,而是一系列“局部搜索”算法。属于“爬山”算法类别的特定算法是 2-opt、3-opt、2.5-opt、4-opt,或者通常是任何 N-opt。有关其中一些本地搜索算法(应用于 TSP)的更多详细信息,请参阅论文“旅行推销员问题:局部优化案例研究”(David S. Johnson 和 Lyle A. McGeoch)的第 3 章。
此类别中的一种算法与另一种算法的区别在于它们使用的“邻域函数”(简而言之,它们找到给定解决方案的相邻解决方案的方式)。请注意,在实践中,情况并非总是如此:这些算法通常有几种不同的实现。
爬山算法最明显的局限性在于其性质,即它们是局部搜索算法。因此,他们通常只找到局部最大值(或最小值)。因此,如果这些算法中的任何一个已经收敛到一个局部最小值(或最大值),并且在解决方案或搜索空间中,靠近这个找到的解决方案,有一个更好的解决方案,这些算法都无法找到这个更好的解决方案。他们基本上会被困住。
局部搜索算法通常不会单独使用。它们被用作其他元启发式算法的子程序,如模拟退火、迭代局部搜索或任何蚁群算法。因此,为了克服它们的局限性,我们通常不会单独使用它们,而是将它们与其他算法结合使用,这些算法具有概率性质并且可以找到全局最小值或最大值(例如,任何蚁群算法)。