C++ 最短成本路径
我必须找到从D点到R点的最短路径。这些是固定点。 这是一个例子: 长方体中还包含墙,除非打破墙,否则无法穿过墙。每次破壁都要付出代价,比如说“a”点,其中“a”是一个正整数。 每一个不涉及墙壁的移动,花费你1分 任务是找出所有成本最低的路径,其中有最少数量的破损墙 因为盒子的宽度可以达到100个单元格,所以使用回溯是不相关的。太慢了。我提出的唯一解决方案是:C++ 最短成本路径,c++,algorithm,shortest-path,np,C++,Algorithm,Shortest Path,Np,我必须找到从D点到R点的最短路径。这些是固定点。 这是一个例子: 长方体中还包含墙,除非打破墙,否则无法穿过墙。每次破壁都要付出代价,比如说“a”点,其中“a”是一个正整数。 每一个不涉及墙壁的移动,花费你1分 任务是找出所有成本最低的路径,其中有最少数量的破损墙 因为盒子的宽度可以达到100个单元格,所以使用回溯是不相关的。太慢了。我提出的唯一解决方案是: 如果没有围墙,往东或往南走 如果南部有墙,检查西部是否有墙。若西有墙,打破南墙。如果西边没有墙,往西走,直到你找到一个没有墙的南边牢房。
你能想出一个更好的问题算法吗?我在C++中编程, 这可以很容易地被建模为加权图,然后应用到它。每个正方形都是一个节点。它连接到与其相邻的正方形的节点。根据是否有墙,连接件的重量为1或“a”。这将使您的成本降到最低。最小成本和最小破壁次数可能不同。这可以很容易地建模为加权图,然后应用于它。每个正方形都是一个节点。它连接到与其相邻的正方形的节点。根据是否有墙,连接件的重量为1或“a”。这将使您的成本降到最低。最小成本和最小破壁次数可能不同。这里有一个通用算法(您必须自己实现): 将矩阵转换为加权图:
- 对于矩阵中的每个条目,创建一个
顶点
- 对于每个
,创建一个顶点
,每个相邻的边数组
顶点一个
- 对于每个
,根据打破边
边所连接的两个
之间的墙的成本定义一个权重顶点
然后,从
顶点D
开始,在图上运行Dijkstra算法()。作为输出,您将拥有从顶点D
到图形上任何其他顶点
的最短(最便宜)路径,包括顶点R这里有一个通用算法(您必须自己实现):
将矩阵转换为加权图:
- 对于矩阵中的每个条目,创建一个
顶点
- 对于每个
顶点
,创建一个边数组
,每个相邻的顶点一个
- 对于每个
边
,根据打破边所连接的两个顶点
之间的墙的成本定义一个权重
然后,从顶点D
开始,在图上运行Dijkstra算法()。作为输出,您将拥有从顶点D
到图上任何其他顶点
的最短(最便宜)路径,包括顶点R
两部分“先成本,然后破墙”,可以表示为一对(c,w),按字典进行比较。c是成本,w是破墙的数量。这使得它再次成为一个“单一的东西”(在某种意义上),所以它是一个你可以放入算法中的东西,等等,期望简单的“成本”(作为一个抽象的东西,它可能会增加其他成本或与其他成本相比较)
因此,我们可以使用曼哈顿距离启发法(也许有更聪明的方法不能完全忽略墙壁,但这会起作用——低估距离是可以接受的)。当然,移动成本不会忽略墙壁。邻居将是所有相邻的广场。所有成本都将是我上面描述的一对。两部分“先成本,然后破壁”可以表示为一对(c,w),按字典顺序进行比较。c是成本,w是破墙的数量。这使得它再次成为一个“单一的东西”(在某种意义上),所以它是一个你可以放入算法中的东西,等等,期望简单的“成本”(作为一个抽象的东西,它可能会增加其他成本或与其他成本相比较)
因此,我们可以使用曼哈顿距离启发法(也许有更聪明的方法不能完全忽略墙壁,但这会起作用——低估距离是可以接受的)。当然,移动成本不会忽略墙壁。邻居将是所有相邻的广场。所有费用都将是我上面描述的一对。使用Dijkstra,但对于费用,不打破墙的移动为1,打破墙为(a+0.00001)。然后Dijkstra会给你你想要的,这条路打破了所有最低成本道路中最少的墙
从概念上讲,想象一个旅行者可以跳过墙壁——同时跟踪成本——并且当面临两条路径的选择时,他也可以分成两个完全相同的旅行者,以便同时选择两条路径(罗伯特·弗罗斯特,接受吧!)。一次只有一个旅行者移动,是迄今为止花费最低的一个。那个人动了动,在地板上写着“我只花了x块钱就到了这里”。如果我已经在那里找到了这样一张纸条,如果我能以更便宜的价格到达那里,我会把旧纸条擦掉,然后写下我自己的纸条;如果那是ot