爬山算法简单的例子

时间:2012-01-20 19:19:04

标签: artificial-intelligence hill-climbing

我对Hill Climbing算法有点困惑。 我想“运行”算法,直到我找到该树中的第一个解决方案(“a”是初始,h和k是最终状态),并且它表示状态附近的数字是启发式值。这是树:

enter image description here

我的问题:  我正试图在树上爬山,所以我们开始了 - > F-> g然后什么??完成(没有结果),但我读到登山不能回去做出新的选择(例如j或e)?这是正确的吗 ? 如果我可以回去怎么样?我的意思是我们改变我们的初始选择示例,我们选择e而不是g或j而不是f

很抱歉,如果我的问题太简单了。

7 个答案:

答案 0 :(得分:13)

使用Hill Climbing避免陷入局部最大值的常用方法是使用随机重启。在您的示例中,如果G是局部最大值,算法将停在那里,然后选择另一个随机节点重新启动。因此,如果选择J或C(或者可能是A,B或D),您会发现H或K中的全局最大值。冲洗并重复足够的次数,您将找到全局最大值或接近的值;取决于时间/资源限制和问题空间。

请注意,像Hill Climbing这样的本地搜索不完整,无法保证找到全局最大值。当然,好处是它需要一小部分资源。在实践中并应用于正确的问题,这是一个非常有效的解决方案。

答案 1 :(得分:2)

您可以尝试使用名为simulated annealing的技术来阻止您的搜索卡在本地最小值上。本质上,在模拟退火中,有一个参数T可以控制您移动到次优邻域状态的可能性。如果T很高,那么你更有可能在相邻的状态下进行次优移动,从而在卡住那里时可能会逃脱局部最小值,如果你使用正常的爬坡,你就不会这样做。 / p>

答案 2 :(得分:1)

登山无法保证不会陷入局部极小/最大值。 但是,只有最纯粹的爬山形式才能让你回溯。

一次简单的登山攀登将避免局部最小化问题(以更多的时间和记忆为代价)是禁忌搜索,你可以记住以前的不良结果,并有目的地避免它们。

答案 3 :(得分:0)

爬山的一个问题是卡在当地的最小值和这是当你到达F时发生的事情。爬山的改进版本(实际上实际使用)是通过在搜索树中选择一个随机节点来重新启动整个过程。再次继续寻找最佳解决方案。如果再一次陷入某些局部最小值,则必须再次使用其他随机节点重新启动。一般来说,没有限制。你可以重新做这个寻找最佳解决方案的过程。达到此限制后,您将在流程中选择的所有本地最小值中选择最少的一个。虽然它仍然不完整,但是这个有更好的机会找到全局最优解决方案。

答案 4 :(得分:0)

实际上在Hill Climbing中,你通常不会回溯,因为你没有跟踪状态(它是本地搜索),你会离开最大值。无论是回溯还是禁忌搜索都无法回答这个问题:前者只是让你远离局部最大值而后者让你不再重新审视相同的局部最大值。两者都不会帮助你达到全局最大值。 - 泰森2012年10月16日22:59

“你记得以前的不良结果并有目的地避免它们”我不能同意,你标记为禁忌也是好的解决方案,但你不想再次遵循相同的路径。 -

答案 5 :(得分:0)

以下是解决方案:

A - > F,具有最小可能成本F - > G的成本为3,但没有路径。

从G以外的最低成本重新启动,它是E,因为E已插入队列/堆栈/优先级队列或您使用的任何数据结构。

因此E - >我但是我的成本比E高,因此你被困:S

从F E&以外的最低成本重新启动G,因此我们选择J,因为J的成本低于B,差值为2,即J = 8 B = 10

J-> K,成本为0,因此K是目标

注意:建议的爬山变化随机选取一个点,但选择已经访问过的节点以外的最低成本比随机选择要好。

另一个注意:当节点E没有访问I时因为我的值高于E,算法已经将它插入到数据结构中,因此选择除已访问之外的最小成本将创建一个新路径因为我从未被访问过,因此它的价值低于J,这是我跳过的唯一途径。

答案 6 :(得分:-1)

根据纯山爬坡的路径 A-> J - > ķ 如果你从左到右扩展孩子, 如果你从右向左展开它们,那么你将获得这个局部最小值A - > F - > G, 但一般来说我们从左向右扩展。