本文主要是介绍知情搜索(一)-启发法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
启发法是一个提高复杂问题解决效率的实用策略,它引导程序沿着一条最可能的路径到达解,忽略最没有希望的路径,能避免去检查死角,只使用已搜集的数据。
启发式搜索方法的目的是看了到达目标状态情况下极大地减少节点的数目。
启发式搜索:
- 决定接下来扩展的节点,而不是严格按照广度优先或深度优先的方式进行扩展
- 在生成节点的过程中,决定哪个节点是后继节点,以及待生成的后继节点,而不是一次性生成所有可能的节点
- 确定某些节点应该从搜索树中丢弃(或裁剪掉)
爬山法
爬山法背后概念是爬山过程中,你可能接近了顶部的目标节点,但是你无法从当前位置到达目标。它最简单的形式是一种贪婪算法,它使用一种测度(最大化这种测度或最小化这种测度)来指导它到达目标。
最陡爬山法
最陡爬山法是你能够接近某个目标状态,能够在给定的状态下做出决策,并且从多个可能的选项中做出最好的决定。
伪代码实现:
//steepest-ascent Hill climbing
Hillclimbing(Root_Node, goal)
{Create Queue Q;If(Root_Node = goal) return sucessesPush all the children of Root_Node in to Qwhile(Q_Is_Not_Empty){Find the child which has minium distance to goal}//end of whileBest_child = the child which has minium distance to goalIf(Best_child is not a leaf)Hillclimbing(Best_child, goal)ElseIf(Best_child = goal) return Successretum failure;}//end of function
}
某些情况下,爬山法可能出现的问题:山麓问题、高原问题和山脊问题。
山麓问题(局部最大值)
爬山者认为他可能到达山顶,但实际上他到达后看到的并不是山顶。就好比你要去一个公园,从地图和里程表上显示你已经到达了,实际你到达后发现公园的唯一入口在其他地方。
高原问题(相似的局部最大值)
假设有一些良好的相似的局部最大值,但是为了达到最大值必须移动另一个高原。好比有相似的两栋建筑物,你要到达指定的房间,当你越来越接近这房间时,你发现自己身处在错误的建筑物中。
山脊问题
虽然可能存在好的指示让我们接近目标,但在建筑物中它们处于错误的楼层。好比逛百货商店,发现自己要买的商品在其他的楼层。
解决措施
解决局部最大值的方法是回溯,回溯到更早的节点并尝试不同的方向。
当在相邻区域中许多点出现相似值时,可以通过多次应用相同的规则,尝试到达搜索空间的新区域。
山脊问题可以通过一次应用几个规则在几个方向上进行搜索,从而防止被困在某个位置。
最佳优先搜索
最佳优先搜索为了到达目标节点,它会做出探索哪个节点和探索多少节点的决定。
伪代码实现
//Best-First Search
BestFirstSearch(Root_Node, Goal)
{Create Queue Q;Inser Root_Node to Q;while(Q_Is_not_Empty){G = remove from QIf(G = goal) return path from Root_Node to Qwhile(G has child nodes){If(child is not inside Q)Insert child node to QElseinsert the child which has minimum value into the Q,delet all the other nodes.sort Q by value //smallest Node at the top }}return failure
}
与爬山法相比,最佳优先搜索的优势在于可以通过回溯开放所有开放列表的节点,从错误、假线索、死胡同恢复。
集束搜索(Beam Search)
Beam Search(集束搜索):是一种启发式图搜索算法,在图的解空间比较大的情况下,为了减少搜索所占用的空间和时间,在每一步深度扩展的时候,剪掉一些质量比较差的结点,保留下一些质量较高的结点。
这篇关于知情搜索(一)-启发法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!