Algorithm 寻路、A星和速度惯性
这里有一个重复的问题和一个我试图在这里实现的答案,但遇到了困难 我有一个障碍物网格,计算机可以在四个基本方向上移动,并使用a-star或Djikstra算法实现寻路 但是,我还想添加“速度”,因此,与其相邻的是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
向左移动
,向右移动
,向上移动
,向下移动
,不如向左加速
,向右加速
,向上加速
,什么也不做
。在每次移动中,上一次移动的速度将保持不变,加速度的增量将被添加<代码>加速成本为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运行。luaDijkstra/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。。。实际上,我想将其他问题映射到一个要使用*解决的图形。基本上是一个太空船游戏,飞船需要计划它的移动。是否在市场上买东西,是否去另一个星球旅行,是否接乘客。