人工智能-搜索算法

来源:互联网 发布:debian 8 切换php版本 编辑:程序博客网 时间:2024/05/22 08:11

模拟退火

“退火(Annealing)”是金属铸造的一个过程,它是指金属首先在高温下熔化,然后让它冷却下来直到它成为固态。因此,在退火的物理过程中,温度很高的材料的能量逐渐丢失,最终达到最小能量的状态。一般情况下,大多数物理过程是从高温状态转换到低温状态,但是仍然有比较小的概率,它可以跨越能量状态的低谷,上升到另一个能量状态。

例如,考虑一个滚动的球,从一个高能量状态滚动到一个低谷,然后滚到高一点的能量状态。然而滚动到高能量状态的概率非常小,一般为:p=exp(-ΔE/KT)其中p是从低能量状态转换到高能量状态的概率,ΔE表示能量正的改变,K是Boltzman常量,T是当前状态的温度。对于很小的ΔE,p的值比ΔE很大时的p的值要大。

这样自然就会有一个问题:如何在搜索中实现退火?在这个阶段,应该记住:需要模拟退火算法在函数f产生了没有比当前状态更好的下一个状态时,指出搜索的方向。这样,对所有可能的下一个合理状态计算ΔE的值,并用下式计算p′的值:p′=exp(-ΔE/T)在闭区间[0,1]中随机得到一个数字,然后和p′比较。如果p′大,则选择它作为下一个转换状态。参数T在搜索程序中是逐渐降低的。这时由于T降低,p′也降低,从而使得算法终止在一个稳定的状态。

爬山法

爬山方法是一种局部择优的方法,是采用启发式方法,对深度优先搜索的一种改进。前面讲述的“生成与测试”搜索只是扩展搜索空间,并且在该空间中检测目标是否出现。这种方法几乎是一种耗尽式搜索,效率很低,于是人们考虑是否可以利用反馈信息以帮助决定生成什么样的解,这就是爬山法。爬山法采用了前面定义的评估函数f(x)用来估计目标状态和当前状态的“距离”。当一个节点被扩展以后,对节点x进行评估得到f(x),按f(x)的升序排列这些函数值,并把这些节点按f(x)的升序压入栈。所以,栈顶元素具有最小的f(x)值。

现在弹出栈顶元素并和目标节点比较,如果栈顶元素不是目标,则扩展栈顶元素,并计算其所有子状态的f值,同时按升序把这些子状态压入栈中。如果栈顶元素是目标,则算法退出,否则该过程会循环下去,直到栈为空。下面给出它的搜索过程:算法3.5 爬山法。

ProcedureHill-ClimbingBegin(1)确定可能的开始状态并测量它们和目标节点的距离(f);以f升序排列把这些节点压入栈;(2)Repeat弹出栈顶元素;If栈顶元素=goal;返回并结束;Else把该元素的子女以f升序排列压入栈中;Until栈为空;End.爬山法一般有下面3个问题:

(1)局部最大:

由于爬山法每次选择f值最小的节点时都是从子节点范围内选择,选择范围较窄。因此爬山法是一种局部择优的方法。局部最大一般比状态空间中全局最大要小,一旦到达了局部最大,算法就会停止,即便该答案可能并不能让人满意。

(2)平顶(Plateau):

平顶是状态空间中评估函数值基本不变的一个区域,也称为高地,在某一局部点周围f(x)为常量。一旦搜索到达了一个平顶,搜索就无法确定要搜索的最佳方向,会产生随机走动,这使得搜索效率降低。

(3)山脊(Ridge):

山脊可能具有陡峭的斜面,所以搜索可以比较容易地到达山脊的顶部,但是山脊的顶部到山峰之间可能倾斜得很平缓。除非正好有合适的操作符直接沿着山脊的顶部移动,否则该搜索可能会在山脊的两面来回震荡,搜索的前进步伐会很小。

在每种情况中,算法都会到达一个点,使得算法无法继续前进。如果出现这种情况,可以从另外一个点重新启动该算法,这称为随机重启爬山法。爬山法是否成功和状态空间“表面”的形状有很大的关系:如果只有很少的局部最大,随机重启爬山法将会很快地找到一个比较好的解答。如果该问题是NP完全的,则该算法不可能好于指数时间,这是因为一定具有指数数量的局部最大值。然而,通常经过比较少的步骤,爬山法一般就可以得到比较合理的解答。

0 0
原创粉丝点击