我的问题是这是如何计算的,我们如何说这个启发式是可接受和一致的?
让我们首先从什么是可接受的和一致的启发式的定义开始:
-
一个可接受的启发式从不高估达到目标的成本,即估计达到目标的成本不大于图中从该节点到目标节点的最短路径的成本.
您可以很容易地看到,对于图中的所有节点 n,估计 h(n) 始终小于或等于实际最短路径。例如,h(B) = 0 F->G)。
-
令 c(n, m) 表示图中从节点n 出发的最优路径的成本
到另一个节点n'。启发式估计函数h(n) 在以下情况下是一致的
h(n) + c(n, m) <= h(n') 用于图中的所有节点 n , n'。另一种看待一致性属性的方式是单调性。一致的启发式函数也称为单调函数,由于估计的部分解决方案的最终成本,沿着到达目标的最佳路径是单调非递减的。因此,我们可以注意到您的启发式函数并不一致。
h(A) + c(A, B) 6 + 2
让我做一个类比,以一种不那么数学的方式来解释它。
你要和你的朋友去跑步。在某些时候,你会问你的朋友需要多长时间才能完成你的跑步。他是一个非常乐观的人,他总是给你一个你可以做的更短的时间,即使你在剩下的路上一直在跑。
但是,他的估计并不是很一致。在 A 点,他告诉你至少还要再跑一个小时,跑了 30 分钟后你又问他。现在,他告诉你距离那里至少还有 5 分钟。 A 点的估计信息比 B 点的信息少,因此你的启发式朋友是不一致的。
关于 IDA* 的执行,我从维基百科复制粘贴算法的 伪代码(我尚未测试):
node current node
g the cost to reach current node
f estimated cost of the cheapest path (root..node..goal)
h(node) estimated cost of the cheapest path (node..goal)
cost(node, succ) step cost function
is_goal(node) goal test
successors(node) node expanding function
procedure ida_star(root)
bound := h(root)
loop
t := search(root, 0, bound)
if t = FOUND then return bound
if t = ∞ then return NOT_FOUND
bound := t
end loop
end procedure
function search(node, g, bound)
f := g + h(node)
if f > bound then return f
if is_goal(node) then return FOUND
min := ∞
for succ in successors(node) do
t := search(succ, g + cost(node, succ), bound)
if t = FOUND then return FOUND
if t < min then min := t
end for
return min
end function
按照您的示例执行很简单。首先,我们使用起始节点的启发式函数的值设置边界(或阈值)。我们使用深度优先搜索方法来探索图形,排除 f 值大于界限的分支。例如,f(F) = g(F) + h(F) = 4 + 4 > bound = 6。
节点按以下顺序探索:A、B、D、C、D、G。在算法的第一次迭代中,节点 A、B、D 被探索,我们用完了小于界限的选项。
边界被更新,并在第二次迭代中探索节点 C、D 和 G。一旦我们到达解节点,估计值 (7) 小于界限 (8),我们就有了最优的最短路径。