分支和界限最短路径变化之间的区别

时间:2019-03-10 16:11:26

标签: algorithm artificial-intelligence graph-algorithm shortest-path dijkstra

我必须实现以下算法:

  • 分支与约束
  • 带有扩展列表的分支与界限
  • 具有可允许的启发式功能的分支与界限
  • A *算法(在后面提到的MIT指南中也称为Dijkstra算法)

按照MIT的this指南,我对以下四个实现有了以下理解。


假设您要尝试找到节点 S 和节点 E 之间的最短(最佳)路径。


简单分支与约束

  • 必须先找到到达每个节点的最短路径,然后才能确定找到到 E 的最短路径。
  • 使用常规队列来跟踪其必须扫描的节点。

带有扩展列表的分支与界限

  • 扩展列表跟踪我们已经访问过的节点,因此我们不会重新访问已经具有最佳路径的节点。
  • 为了使该方法保证最佳路径,必须使用优先级队列,以便在访问节点时,可以确定到该节点的路径是最佳路径(本指南中未明确说明) )
  • 一旦到达末端节点,就可以停止该算法
  • 它比常规B&B更好,但是它对端节点 E 没有偏见,因此可能更快

A *算法

A* = B&B + dynamic programming + admissible heuristic(来自指南)

  • 允许的启发式 h(N),在这种情况下,是当前最著名的N路径的长度+ N到E的欧几里得距离。
    • 这允许对算法进行端节点偏置,而不是扫描所有内容。
  • 优先级队列用于选择次优节点(动态编程)(类似于扩展列表的实现)

带有可允许的启发式的分支约束

现在这是我要解决的问题,因为在没有优先级队列的情况下添加启发式方法似乎比简单的B&B算法没有任何优势,因为我们不对具有优先级队列的节点进行优先级排序(因为如果这样做, ,那只会是A *算法)。

除非,也许,启发式算法使我们即使没有优先级队列也可以通过我不太了解的过程检查更少的节点。


很高兴能看到一个解释,为什么我们要在不添加优先级队列的情况下向B&B算法添加启发式方法。

0 个答案:

没有答案