我必须编写AI来控制游戏中太空船的许多推进喷气机。
为简单起见: -
让空间为1D
宇宙飞船是一个点,只有一架喷气机。
让x
,v
和a
为宇宙飞船的位置,速度和加速度。
让F
成为适用于船舶的喷射力。
我知道宇宙飞船的质量m
,让我们说m
= 1。
以下是摘要: -
acceleration = F/m;
v = vOld + acceleration*timestep;
x = xOld + v*timestep;
目标是将船降落在0速度的某个位置: - x
= 0且v
= 0。
AI可以加速"或者"减速"喷气机: -
F+=flexibility;
or
F-=flexibility;
AI可以访问当前x
,v
和F
。 AI也可以缓存它。
我该如何编程AI?
创意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
我混合了两个想法: -
if |x|>=thresholdX
- >使用想法1
if |x|~0
- >用意念2
介于两者之间 - >重量平均为2个想法
在这里,thresholdX
是另一个神奇的数字
我使用等式中的a
来找到合适的F
。 (F=ma
)
结果如下: -
图形有噪声,因为质量近似于另一个AI,并且存在一些小的随机外力。
如果有人问,我可以发布我的C ++代码(~100行)。
答案 0 :(得分:5)
首先 - 您是否打算登陆身体(有质量),或者只是在太空中的某个任意点停下来?你的问题是“土地”,所以我假设前者,在这种情况下你也需要考虑引力。这应该很容易做到:F_actual = F_engine - F_gravity
。
其次 - 你会如何在现实生活中做到这一点?现实生活中的飞行员希望在“滑行坡道”(在到达跑道之前)“建立”他们的飞机,飞机“修剪”,以便在理想条件下(没有风等),飞机可以自行着陆而无法控制输入(我简化了一点,忽略了耀斑等)。
对于火箭,我可能想让自己进入一种情况,即在地面以上的某个安全高度,我的下降速度是这样的,当发动机以一定的恒定功率运转时,火箭将通过以下方式落地:本身,没有额外的输入,除了在着陆点杀死引擎。 (实际上,我希望飞行系统允许我在触地得分时自动杀死。)
要了解这是如何工作的,只需反过来运行问题。从x=0, v=0
开始,使用a=some constant and reasonable acceleration that the engine can produce
,随着火箭上升,随着时间的推移绘制x和v。显然,v=at
(一条线)和x是这些值的总和(一条抛物线)。
抛物线是你的“滑坡”。现在,而不是试图同时获得x=0
和v=0
(没有x变为负数),你的问题就变成了“如何在安全高度撞击滑翔坡?”。所以你的逻辑就像:
一些注意事项:
v
对x
的情节,允许常数a
产生轻柔的触地,而无需额外的控制输入。答案 1 :(得分:0)
第一步是用手动控制来实现游戏。用物理学建立模拟并为飞行员制作一些按钮。如果太空船的手动着陆比第一个AI原型的时间有效。这通常被实施为单臂强盗,这意味着随机发生器计算加速度。除了观察和希望,用户没有其他可能性。下一个AI原型也将手工实现,使用伪随机发生器。这意味着,爆发在一定范围内,但仍然是随机的。问题不在于,如果AI能够着陆,问题是:需要AI 10试验或100次试验。降低故障率的最佳做法是使用OP中的规则。这些启发式方法在每种情况下都不起作用,它们只能改进伪随机生成器。这有点像程序生成。