我的直觉和假设是每当我们不能使用贪婪时,那么A *将成为可行的方式,但我并非100%肯定。我需要更多关于如何识别和发现A *算法的例子和模式。
有人可以给出一些特殊的极端情况,当你第一次看到它并且你知道这不会是贪婪的,或者它必须是A *而不用费心去尝试。
答案 0 :(得分:5)
通常,术语greedy用于描述不backtrack的算法。这些是通过最大化启发式(通常是相当“本地”的)来做出选择的算法,然后不再重新考虑该选择。把一个贪婪的算法想象成一个挑选蛋糕然后立即吃掉它的人,而不是把它放在一边并调查另一个蛋糕是否会更好。
相比之下,A*是一种回溯算法:它可以在某种程度上探索选择,但之后能够放弃这些选择并尝试其他可能性。
因此,如果您的问题具有“死胡同”(局部最大值),而无法在解决方案方面取得进一步进展,那么贪婪算法很可能不合适。但这并不一定意味着A *及其变体是您唯一的选择。还有许多其他类型的搜索算法使用不同的技术来逃避死胡同:simulated annealing,Monte Carlo tree search,tabu search,particle swarm optimization,...
答案 1 :(得分:2)
贪婪算法失败的典型案例是在目标附近死路的走廊情况。如果你有一个距目标距离的启发式算法,那么贪婪算法将沿着走廊走下去,因为那些位置更接近目标。例如,
_ _ _ _ _ _ _ _ _ _
| . S . . . . | G |
| . _ _ _ _ _ | . |
| . . . . . . . . |
| _ _ _ _ _ _ _ _ |
请注意,代理必须“离开”目标(G)才能从开始(S)到达目标,这不是贪婪算法所建议的。
答案 2 :(得分:0)
A *是单源单目标最短路径算法。
当您可以将问题呈现为最短距离问题时,您可以使用它,并且您可以找到不高估的启发式(例如使用欧氏距离)。