我需要编写AI来控制游戏中的飞船的多个推进喷嘴。
为简单起见:
将空间视为1D。
飞船是一个点,只有1个喷嘴。
规则和问题
设x
、v
和a
分别表示飞船的位置、速度和加速度。
设F
是施加在飞船上的喷流的力。
我知道飞船的质量m
,假设m
= 1。
以下是摘要:
acceleration = F/m;
v = vOld + acceleration*timestep;
x = xOld + v*timestep;
这个目标是让飞船以0速度降落在特定位置:x
=0和v
=0。
人工智能可以“加速”或“减速”喷气:
F+=flexibility;
or
F-=flexibility;
人工智能可以访问当前的x
、v
和F
。人工智能还可以缓存它。
那么我应该如何编程人工智能呢?
我不太好的解决方案
思路1:最终,x
应该等于0。
假设a
是一个常数:
(current x) + (current v) * t + 1/2 * a * t * t = 0
t
是一个神奇的数字 - 它需要多长时间才能使飞船的x
=0。
想法2:最后,v
应该等于0。
(current v) + a*t = 0
我将两个想法结合起来:
如果 |x|>=thresholdX
--> 使用想法1
如果 |x|~0
--> 使用想法2
介于两者之间 --> 对两个想法加权平均
这里,thresholdX
是另一个魔数。
我使用方程中的 a
来找到适当的 F
。(F=ma
)
这是结果:
由于质量由另一个 AI 近似计算,并且存在一些小的随机外力,因此图形具有噪声。
如果有人问,我可以发布我的 C++ 代码(约 100 行)。
a
几乎是不可能的——对于每个x
,只有一个可能的v
可以允许平稳着陆,而对于每个v
,也只有一个x
。您需要一个变量加速度a(t)
。 - pingula(t)
的公式应该是什么吗? - javaLovera(t)
的确定形式)很难,因为有无限多个解可以实现最终结果(当x == 0
时,v == 0
)。一个不太数学化的解决方案可能是使用某些学习算法进行训练或制作一个监管控制系统,但这些也可能很困难。我在这里概述了一种比较简单的方法:http://stackoverflow.com/questions/38870822/how-to-implement-arriving-behavior-with-time-delta/38880776#38880776 - pingulv-x
图表,并绘制一个区域,其中你可以在给定最大值a
(基本上是火箭的最大推力)的情况下进行安全着陆。 - biziclop