我知道一般问题包括局部最大值和高原,但是我很好奇是否还有与此特定搜索相关的更多问题,以及为了克服这些问题我的最佳行动方案是什么。
有人还可以给我一个例子,说明该搜索适合用于哪种类型的问题吗?
最佳优先搜索的问题:
- 它很贪婪。在许多情况下,它会带来非常快速的解决方案
(因为你开发的节点数没有增加
呈指数增长,随着深度的增加而线性增加
解决方案!),但是它通常没有优化,因为你的
启发式函数有一定的误差,有时会出错
回答要探索的下一个节点。
-
无限分支还存在一个问题。假设你是
跟随深度节点的分支i
具有启发价值h(v_i) = 2^-i
。你永远不会达到零,但首先贪婪是最好的
将继续开发这些节点。
Example:
2
/ \
/ \
/ \
1 1.5
| |
1/2 1
| |
1/4 0
|
1/8
|
1/16
|
...
注意上面的是允许的启发函数 http://en.wikipedia.org/wiki/Admissible_heuristic,但尽管如此,最好的首次搜索永远不会得到解决方案,它会陷入无限分支。
解决方案:
- 为了克服它,我们可以使用统一算法(例如 Dijkstra 算法)
算法或未加权图的 BFS)
- 您可以结合使用“最佳优先搜索”和 Dijkstra,
被称为A*算法 http://en.wikipedia.org/wiki/A*_search_algorithm.
A*算法实际上是一种贪婪最佳优先算法,只不过不是根据选择h(v)
,您选择了接下来要探索的节点f(v) = h(v) + g(v)
(where g(v)
是“到目前为止的成本”。如果给定一个解,则该算法是完整的(如果存在,则找到一个解决方案)并且是最优的(找到“最佳”解决方案)允许的启发函数 http://en.wikipedia.org/wiki/Admissible_heuristic.
何时使用最佳优先搜索:
- 如果你有一个完美的启发式(表示为
h*
在文献中),最好的首次搜索将找到最佳解决方案 - 而且速度很快。
- 如果您不关心最佳解决方案,您只想快速找到一个解决方案 - 它通常可以解决问题(但您必须小心无限分支问题)。
- 当我们使用 A* 时,我们实际上使用的是最佳优先搜索 - 但在
f:V->R
而不是在h:V->R
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)