Algorithm 寻路扩展-最少转弯的路径

Algorithm 寻路扩展-最少转弯的路径,algorithm,methods,path-finding,Algorithm,Methods,Path Finding,首先,我要感谢所有花时间看这个的人。我们中的许多人都熟悉Dijkstra的算法,因此A*。我在很多应用程序中都使用了*,但对于这个特殊情况,我很难想出一个算法。这种情况需要找到转弯次数最少的路径。事实上,我甚至不在乎“最短”的路线,只在乎转弯最少的那条!我使用的是一个上下左右的网格,没有对角线,这意味着有很多可能的最短路径解决方案。例如,在一个5x5网格中,起点在左下角,恩德在右上角,我们可以做一个楼梯,或者一直走到右边,然后一直走到上面(对我来说更好!) 使用*you use Cost=Dis

首先,我要感谢所有花时间看这个的人。我们中的许多人都熟悉Dijkstra的算法,因此A*。我在很多应用程序中都使用了*,但对于这个特殊情况,我很难想出一个算法。这种情况需要找到转弯次数最少的路径。事实上,我甚至不在乎“最短”的路线,只在乎转弯最少的那条!我使用的是一个上下左右的网格,没有对角线,这意味着有很多可能的最短路径解决方案。例如,在一个5x5网格中,起点在左下角,恩德在右上角,我们可以做一个楼梯,或者一直走到右边,然后一直走到上面(对我来说更好!)

使用*you use Cost=DistanceFromStart+启发式(Manhattan),我尝试通过添加numTurns成本来扩展它。在我遇到如下情况之前,这是非常有效的:

|0 0 0 0*0 0 0

|0 0 1'2'+0 0 E

|0 0 S 12*0 0

|0 0 0 0*0 0 0

|0 0 0 0*0 0 0

请原谅糟糕的格式,我希望你能看到我的意图

*是墙,0是空的,s是开始,E是结束。您会发现路径S->1->2->+将给出与S->1'->2'->+相同的成本。到目前为止,他们都有一个转弯处,离S的距离相同,曼哈顿也一样。然而,从+,如果我们走主要(')路线,我们不必转弯。但是如果我们走12路,我们必须右转(+1成本)。因此,尽管我们可能会先到达那里,但这不是一条拐弯最少的道路

我尝试过一些调整,比如让同一个正方形的多个同时出现在优先级队列中,这样它们都有机会(如果它们的值在堆中最小的话)。我还尝试过其他“黑客”解决方案,但我不断收到未涵盖的案例。有人知道这样做的直观方法吗?再一次,我将尽我所能提出这个问题:


给定一个有上下左右移动和障碍物的网格,我如何找到从a到B最少转弯的路径。我不需要保证最短距离。该应用程序是一个机器人程序,用于连接瓷砖,如果瓷砖之间的间隔小于3圈,则只能消除瓷砖。再次感谢所有能帮忙的人

我认为你需要在你的州里加入一个“方向”。当你从1->2->+到达“+”时,你面对的是“向上”,当你从1->2->+到达“+”时,你面对的是“右”

然后,你可以将改变方向的成本纳入你的“行动成本”。也就是说,从一个州到另一个州的旅行费用。现在,当估计向右移动时,使用1->2->+将考虑改变方向的成本,而1'->2'->+不会

当您进入A*的“生成子对象”阶段时,您可能只是将“到目前为止的成本”增加1,即移动到邻居所需的网格单元数。如果邻居指向您当前位置的方向为!=你现在的方向


对于起点,您可以使用一些特殊的面向方向,如全向,这样从起点位置移动到任何正方形都不会产生成本。

创建一个新的距离矩阵。对于位置i和j,如果它们在直线上(无转弯),则设置距离(i,j)=1。对于设置为无穷大的其余元素。现在运行最短距离算法。

感谢您的快速响应,我等待您的进一步解释。我的棋盘格上确实有方向,所以如果我的最后一个动作是“正确的”,我再次向右移动,numTurns保持不变。但是,如果我向左、向下或向上移动,numTurns将迭代,curDirection将更改为其各自的值。问题是,除非我误解了你的解决方案,否则如果12路径首先到达+并且+被选中,+被锁定到位(关闭列表)。从那时起,任何进一步的计算都不会知道1'2'路径从未到达它(无论成本如何),因此即使在1'2上右转会产生成本,而1'2'不会,也不是+意识到这一点,而是+右侧的平方。当我们到达那里的时候,我想回到过去已经太晚了(除非我们允许同一个广场有多个不同的历史遗迹)。再次感谢您抽出时间和我一起看这个!从1->2->+到达的“+”状态与从1->2->+到达的“+”状态不同。在比较两个状态时,仅比较它们的x、y坐标是不够的,还必须比较在这些坐标处面对的方向。这样,两个“+”状态都可以添加到列表中,但代价不同。我希望我能投票支持你,但我想我需要问更多的问题。实际上,你的解决方案和我的相同。事实证明,由于我称之为“集体”的各种方式,它不起作用。你看,这个板有将近100个分片,所以我至少调用了50次寻路算法。我忘记以各种方式重置磁贴,我没有清除各种数据结构,等等。因此,错误似乎来自寻路,但实际上是它的错误输入。它似乎正在工作(祈求好运),我正在完成UI。我想再次感谢你抽出时间。你的算法比我快得多,所以我希望我几天前问过你。但我想这对大脑有好处!这是很有趣的东西,我喜欢自动化,所以制作游戏求解器很有趣。祝你一切顺利!我假设这将使用距离图的O(n^3)多个元素,对吗?初始矩阵的每一行都有n个元素,每个元素(忽略重复项)必须计算n个距离。矩阵中有n行。类似地,这也适用于列,但在O表示法中加法并不重要。将Dijsktra算法与pr结合使用