我正在尝试为以下问题找到最佳解决方案
(x,y)
。y
值(当前节点y值+1)。x
值的变化成本为1 x
的值没有变化,则从节点到其邻近区域没有任何费用。y
值的节点被认为是相邻的。最优解决方案是成本最低的解决方案,我正在考虑使用A *路径寻找算法来寻找最佳解决方案。
我的问题,A *对于这类问题是一个不错的选择,还是我应该看看任何其他算法,而且我还在考虑使用递归方法来计算启发式成本,但我感觉它是不是个好主意。
这是我认为启发式函数将如此
的示例但据我所知,启发式意味着是近似的,所以我认为就启发式功能而言,我的方向是错误的
答案 0 :(得分:15)
A *保证在非负边缘路径成本的情况下找到图中成本最低的路径,前提是您使用了适当的启发式算法。是什么让启发式功能合适?
首先,它必须是可接受的,i。即对于任何节点,它应该对从该节点到任何目标节点的最便宜路径的成本产生低估或正确的估计。这意味着启发式应该永远不会高估从节点到目标的成本。
请注意,如果您的启发式计算每个节点的估计成本为0,那么A *只会变为广度优先的穷举搜索。所以h(n)= 0仍然是一个可接受的启发式算法,只有最差的启发式算法。因此,在所有可接受的启发式算法中,更严格的估算目标的成本越高。
其次,计算必须便宜。它当然应该是O(1),并且最好应该单独查看当前节点。按照您的建议递归评估成本将使搜索速度显着降低,而不是更快!
A *适用性的问题因此是否能够提出一个相当好的启发式方法。从你的问题描述中,不清楚你是否可以轻松拿出一个。
根据问题域,如果放宽要求,A *可能非常有用。如果启发式变得不可接受,那么你就失去了找到最佳路径的保证。根据对距离的过高估计程度,解决方案可能仍然足够好(对于“足够好”的问题特定定义)。优点是,有时您可以更快地计算“足够好”的路径。在某些情况下,启发式的概率估计工作良好(它可能有额外的限制,以保持在允许的范围内)。
因此,一般来说,你有广度优先搜索易处理问题,接下来你可以更快地获得A *,以获得可接受的启发式问题。如果你的问题对于广度优先的穷举搜索来说是难以解决的并且不承认启发式,那么你唯一的选择就是找到一个“足够好”的次优解决方案。同样,A *仍然可以在此处使用不可接受的启发式算法,或者您应该查看波束搜索变量。不同之处在于光束搜索对图表当前正在探索的方式的数量有限制,而A *通过选择一些较低成本的子集来间接限制它们。当不同搜索路径之间的成本差异很小时,即使具有宽松的可接受性,也存在A *无法解决的实际情况。在这些问题中,对路径数量有硬限制的波束搜索可以更有效地工作。
答案 1 :(得分:2)
当像Dijkstra这样的东西起作用时,似乎有点过分使用A *。 Dijkstra只适用于非负成本转换,在本例中似乎是正确的。如果你可以进行负成本转换,那么Bellman-Ford也应该有效。