Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 寻路、A星和速度惯性_Algorithm_Search_Path Finding_A Star - Fatal编程技术网

Algorithm 寻路、A星和速度惯性

Algorithm 寻路、A星和速度惯性,algorithm,search,path-finding,a-star,Algorithm,Search,Path Finding,A Star,这里有一个重复的问题和一个我试图在这里实现的答案,但遇到了困难 我有一个障碍物网格,计算机可以在四个基本方向上移动,并使用a-star或Djikstra算法实现寻路 但是,我还想添加“速度”,因此,与其相邻的是向左移动,向右移动,向上移动,向下移动,不如向左加速,向右加速,向上加速,什么也不做。在每次移动中,上一次移动的速度将保持不变,加速度的增量将被添加加速成本为0,而无所事事成本为1 我尝试在一维的基础上用A-star实现这一点,让它找到一条路径,从(X=0,velocity=0)移动到(X

这里有一个重复的问题和一个我试图在这里实现的答案,但遇到了困难

我有一个障碍物网格,计算机可以在四个基本方向上移动,并使用a-star或Djikstra算法实现寻路

但是,我还想添加“速度”,因此,与其相邻的是
向左移动
向右移动
向上移动
向下移动
,不如
向左加速
向右加速
向上加速
什么也不做
。在每次移动中,上一次移动的速度将保持不变,加速度的增量将被添加<代码>加速成本为0,而
无所事事
成本为1

我尝试在一维的基础上用A-star实现这一点,让它找到一条路径,从
(X=0,velocity=0)
移动到
(X=100,velocity=0)
。可用的选项总是
(加速成本=0,减速成本=0,等待成本=1)

它找到一条次优路径来成功完成任务。只加速两次,然后等待49次,减速一次,然后再等待2次,再减速一次,以(
X=100,速度=0)
着陆

最佳路径为:加速100次,等待一次,减速100次

看起来星星可以很好地处理(X,Y)网格中的寻路,其中X和Y是独立的,但不能处理(X,Y)网格,其中Y也依赖于X

关于如何修改A*或Djikstra有什么想法吗?或者有没有一种替代的路径查找算法可以用于惯性

您可以查看我的代码

取消对第120行的注释
filter=function(current)return current.v>99 end,
生成最佳路径,因为它将隐藏“wait”选项,直到速度为100


使用lua a-star-velocity-demo运行。lua

Dijkstra/a-star是一种基于图形的算法,在任何图形上都是行之有效的

看起来星星可以很好地处理(X,Y)网格中的寻路,其中X和Y是独立的,但不能处理(X,Y)网格,其中Y也依赖于X

这是错误的,A-Star和Dijkstra不关心网格。由于简单,经常使用网格:底层图形是隐式的(网格是节点,任意两个相邻平铺之间有垂直)


图形表示 它在您的示例中是否有效,只取决于您是否正确地将系统表示为图形

首先要注意的是: 我试着在一维的基础上用A-star来实现这一点

这是行不通的。位于
x=5,v=8的船舶与位于
x=5,v=-5的船舶状态不同。因此,您的状态由这对
(x,v)
表示。这不是一维问题

第二点需要注意的是:
加速
成本为0,而
无所事事
成本为1

您没有“很快”到达的动机,只是尽可能少地使用
什么都不做。因此:

最佳路径为:加速100次,等待一次,减速100次

错误的原因有很多:

  • 给定惯性,一条最佳(成本最低)路径实际上是加速(10倍),减速(10倍),因为
    1+2+3+4+5+6+7+8+9+10+9+8+7+6+5+4+3+2+1=100
    ,在19个步骤中以零成本到达终点
  • 另一个最佳路径是加速一次,交替(acc/减速)49次,减速。然后在大约102个步骤中达到终点,总成本为零
  • 还有许多类似的“最佳”路径(零成本)是您不想要的
要解决这一问题,只需对远离目标单元格的时间给予非零惩罚((一个常数就可以了,或者可能是欧几里德距离?),而不考虑所采取的行动。(恰恰相反,我会对施加推力施加固定的“燃料”惩罚1,以在有多条可用路径时获得最节能的路径,但这是离题的)

修复您的实现 如果当我们知道存在成本较低的路径时,您的A-Star实现给出了非零成本的结果,那么您就有一个需要修复的bug

走X,Y 如果您计划在具有惯性的二维栅格中导航,则需要4D节点表示(x、y、Vx、Vy)

要警惕两件事:

  • 4D空间可能会变得非常占用内存。因为x和Vx是链接的,所以你不能用它来补救
  • 在有障碍物的4D中,碰撞检测将比传统的细胞基运动更复杂。为确保不穿过墙,请使用naive raycast,或者(更好)使用轮询顶点移动

full 2d(x=horizaontal,velocity=vertical)A*应允许您探索x/vel的全部组合,并最终找到最佳组合(我认为是最快的?),只要您不过早修剪它。也就是说,我真的看不到制作4d版本(2d coord+vel)的实用方法。你是否有需要绕过的障碍物,或者只是开始/结束?如果是前者,碰撞时会发生什么?特工可以利用他们的战术来调整自己的轨迹吗?谢谢!修复了过早删除修剪后的问题。下一步我会尝试4d。。。实际上,我想将其他问题映射到一个要使用*解决的图形。基本上是一个太空船游戏,飞船需要计划它的移动。是否在市场上买东西,是否去另一个星球旅行,是否接乘客。