最短的成本路径

时间:2014-02-23 16:39:56

标签: c++ algorithm shortest-path np

我必须找到从D点到R的最短路径。这些是固定点。 这是一个例子:

enter image description here

该框还包含墙,除非您打破它们,否则无法穿过它们。每个隔断花费你,让我们说“a”点,其中“a”是一个正整数。 每次不涉及墙的移动都要花费1分。

任务是找出最低成本的所有路径,即破墙数量最少的路径。

因为盒子的宽度可以达到100个单元格,所以使用回溯无关紧要。这太慢了。我提出的唯一解决方案就是这个:

  1. 如果没有墙壁,向东或向南走
  2. 如果南边有墙,请检查西边是否有墙。如果西有墙,则打破南墙。如果西边没有墙,往西走,直到找到一个没有墙的南方小区。向南和向东重复此过程,直到您按此顺序超过破墙的成本。如果从西边的路径进入同一个地方,好像我已经打破南墙并且花费相同或小于“a”点,那么使用这条路径,否则刹车南墙。
  3. 如果遇到上述情况,请根据方框边界制动南墙或东墙。
  4. 重复步骤1,2,3,直到“乘客”到达R点。在这3个步骤之间,存在“else-if”关系。

    你能想出一个更好的问题算法吗?我用C ++编程。

4 个答案:

答案 0 :(得分:2)

使用Dijkstra,但是对于成本而言,它为1表示不会破坏墙的移动,以及(a + 0.00001)用于打破墙。然后Dijkstra将为您提供您想要的东西,即在所有最低成本路径中打破最少墙壁的路径。

从概念上讲,想象一个旅行者可以跳过墙壁 - 同时跟踪成本 - 并且当面对两条路径的选择时,也可以分成两个相同的旅行者,以便将两者都带走(拿下它们,罗伯特弗罗斯特!)。只有一位旅行者一次移动,到目前为止成本最低的旅行者。那一个移动,并写在地板上“我到达这里仅花费x”。如果我已经找到了这样的笔记,如果我更便宜地到达那里,我会删除旧笔记并写下我自己的笔记;如果那个其他旅行者以更便宜的方式到达那里我会自杀。

答案 1 :(得分:1)

两部分“先花费,然后破墙”,可以表示为一对(c,w),按字典顺序进行比较。 c是成本,w是破墙的数量。这使得它再次成为“单一的东西”(在某种意义上),所以你可以将它放入算法等等,只需要“成本”(作为一个抽象的东西,它可能会增加其他成本或比较到另一个成本)。

所以我们可以使用A*,使用曼哈顿距离启发式(也许有一些更聪明的东西不会完全忽视墙壁,但这会起作用 - 低估距离是可以接受的)。当然,运动成本不会忽视墙壁。邻居将是所有相邻的广场。所有费用都是我上面描述的那对。

答案 2 :(得分:0)

这可以很容易地建模为加权图,然后将Dijkstra's shortest path algorithm应用于它。每个方块都是一个节点。它连接到与其相邻的方块的节点。根据是否有墙,连接的重量为1或“a”。这将为您带来最低成本。最小成本和最小数量的隔断可能会有所不同。

答案 3 :(得分:0)

这是一个通用算法(您必须自己完成实施):

将矩阵转换为加权图:

  • 对于矩阵中的每个条目,请创建Vertex
  • 对于每个Vertex,创建一个Edges数组,每个相邻Vertex一个。
  • 对于每个Edge,根据Vertices所连接的Edge之间的隔离墙成本来定义权重。

然后,从Vertex D开始,在图表上运行Dijkstra算法(http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm)。作为输出,您将拥有从Vertex D到图表上任何其他Vertex的最短(最便宜)路径,包括Vertex R