C++ 最短成本路径

C++ 最短成本路径,c++,algorithm,shortest-path,np,C++,Algorithm,Shortest Path,Np,我必须找到从D点到R点的最短路径。这些是固定点。 这是一个例子: 长方体中还包含墙,除非打破墙,否则无法穿过墙。每次破壁都要付出代价,比如说“a”点,其中“a”是一个正整数。 每一个不涉及墙壁的移动,花费你1分 任务是找出所有成本最低的路径,其中有最少数量的破损墙 因为盒子的宽度可以达到100个单元格,所以使用回溯是不相关的。太慢了。我提出的唯一解决方案是: 如果没有围墙,往东或往南走 如果南部有墙,检查西部是否有墙。若西有墙,打破南墙。如果西边没有墙,往西走,直到你找到一个没有墙的南边牢房。

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

长方体中还包含墙,除非打破墙,否则无法穿过墙。每次破壁都要付出代价,比如说“a”点,其中“a”是一个正整数。 每一个不涉及墙壁的移动,花费你1分

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

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

  • 如果没有围墙,往东或往南走
  • 如果南部有墙,检查西部是否有墙。若西有墙,打破南墙。如果西边没有墙,往西走,直到你找到一个没有墙的南边牢房。对south和east重复此过程,直到您超过按此顺序排列的破碎墙的成本。如果从西边来的路进入同一个地方,就像我打破了南墙一样,并且花费相同或少于“a”点,那么就使用这条路,否则就刹车南墙
  • 如果上面没有遇到任何问题,则根据长方体边界,制动南墙或东墙
  • 重复步骤1、2、3,直到“乘客”到达R点。在这三个步骤之间存在“else-if”关系


    你能想出一个更好的问题算法吗?我在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