赞
踩
A*算法求解N数码问题的设计与实现
Table of Contents
A*算法的核心代价函数的设计,loss = g + h,g为当前状态深度,h是关键,h代表当前状态到达目标状态的估计值,h必须满足某些条件,而最重要的条件是h < r,r为当前状态到目标状态的估计值。
以实例理解上述条件。例如在八数码问题中,h可以被设计为“各个数到目标状态需要走的步数的和”,这显然是小于真实需要步数和的,h也可以被设计为“各个数和目标状态不同的个数和”,这个条件显然比第一个条件更加宽松,必然小于真实需要步数。以上即为本次设计的两个代价函数。
另一个例子是连续地图中的寻路算法,h一般设计为欧式距离,即直线距离,这显然比真实需要走的路要短(可能有障碍,弯路等等)。
通过以上两个例子,我们可以直观地理解,为什么估计值h必须小于真实值,但要尽可能的大,接近真实值的下界。例如寻路算法中,你估算的距离越接近真实距离,那么你启发式找到可能的路径就会越准确。理论上,可以严格证明满足这些条件,必然可以找到最优解。
从另一个角度来审视A*算法,它可以视为以代价为步长的广度优先算法,这一点要从代码实现上才能感受到。每次都优先处理代价最小的状态,如果观察搜索树,将会看到它在整个搜索数的节点之间无序跳动(选全局估计代价最小)。
再次,例如在寻路算法中,A*算法在实际运行中,类似于我们人类在找两点之间的最快路径,尽管我们无法确定中间要从何处绕开障碍,但是我们却知道要忘目标靠。下面是A*算法运行实例,它在每个状态,都会对目标计算一次欧式距离,以此约束选择,就仿佛被欧式距离牵引到目标状态一样。
init_state
[[3 1 7]
[6 8 0]
[4 2 5]]
target
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。