Language agnostic 我应该如何开始为炮兵作战游戏设计AI算法?

Language agnostic 我应该如何开始为炮兵作战游戏设计AI算法?,language-agnostic,artificial-intelligence,Language Agnostic,Artificial Intelligence,这是背景。。。在我的空闲时间,我正在设计一个名为Staker的炮兵作战游戏(灵感来源于旧的基本游戏和),我正在用MATLAB编程。你的第一个想法可能是“为什么是MATLAB?有很多其他语言/软件包更适合游戏设计。”你是对的。然而,我是一个呆子,我有兴趣学习如何从头开始设计游戏的细节,所以我不一定要使用预制模块。另外,我已经使用MATLAB多年了,我喜欢用MATLAB做其他人没有真正尝试过的事情 现在来看看眼前的问题:我想加入人工智能,这样玩家就可以对抗电脑了。我刚刚开始考虑如何设计算法,选择方位

这是背景。。。在我的空闲时间,我正在设计一个名为Staker的炮兵作战游戏(灵感来源于旧的基本游戏和),我正在用MATLAB编程。你的第一个想法可能是“为什么是MATLAB?有很多其他语言/软件包更适合游戏设计。”你是对的。然而,我是一个呆子,我有兴趣学习如何从头开始设计游戏的细节,所以我不一定要使用预制模块。另外,我已经使用MATLAB多年了,我喜欢用MATLAB做其他人没有真正尝试过的事情

现在来看看眼前的问题:我想加入人工智能,这样玩家就可以对抗电脑了。我刚刚开始考虑如何设计算法,选择方位角、仰角和射弹速度来击中目标,然后每转一圈进行调整。我觉得也许我一开始就想把问题想得太多了,想把人工智能弄得太复杂了,所以我想我应该停下来问问这里的社区,他们会如何设计算法

一些具体问题:

  • 有没有关于人工智能设计的具体参考资料,你会建议我去查阅

  • 您是否会设计AI玩家以连续的方式改变难度(难度从0(容易)到1(困难),仍然使用相同的通用算法),或者您是否会为离散数量的AI玩家设计特定的算法(就像一个容易的敌人向任意方向开火,或者一个能够解释风的影响的硬敌人)

  • 你会从哪种数学算法(伪代码描述)开始


  • 一些附加信息:我用来模拟弹丸运动的模型包含流体阻力和风的影响。“流体”可以是空气或水。在空气中,空气密度(以及阻力的影响)根据一些简单的大气模型,随着离地高度的变化而变化。在水中,阻力非常大,弹丸通常需要额外的推力。换句话说,弹丸可能会受到重力以外的力的影响。

    在真实的炮兵情况下,所有这些因素都可以通过公式或简单的公式来处理蛮力模拟:发射一个电子炮弹,施加所有相关的力,看看它落在哪里。调整并重试,直到电子炮弹击中目标。现在你有你的号码发送给枪

    考虑到情况的复杂性,我怀疑没有比蛮力更好的答案了。虽然你可以预先计算出预期阻力效应与速度的关系表,但我认为这是不值得的

    当然,AI每次向你头上扔第一颗炮弹的游戏并不有趣。一旦你知道了正确的值,你就必须让AI成为一个糟糕的射击。对射击应用随机因子,然后朝目标走去——每次射击时,将它朝着真正的目标移动30+随机(140%)

    编辑:


    我确实同意BCS关于随着时间的推移而改进它的想法。我说过了,但后来改变了主意,决定如何写一堆,结果忘了把它放回去。它应该越硬,随机分量就应该越小。

    洛伦的蛮力解决方案很有吸引力,因为它允许简单的操作通过增加更多的迭代来进行“智能调整”。此外,迭代的调整因子可能是智能的一部分,因为某些值会使其更快收敛


    此外,对于基本系统(无阻力、风等),有一个封闭形式的解决方案,可以从基本物理文本中导出。我会首先猜测,然后每转一圈进行一次或多次迭代。您可能希望尝试提出一个经验校正相关性,以改进第一次射击(这将使首次射击分布的平均值更接近正确)

    谢谢Loren和BCS,我想你已经想到了我正在考虑的一个想法(这引发了上面的问题2)。AIs回合的伪代码如下所示:

    nSims;        % A variable storing the numbers of projectile simulations
                  %    done per turn for the AI (i.e. difficulty)
    prevParams;   % A variable storing the previous shot parameters
    prevResults;  % A variable storing some measure of accuracy of the last shot
    newParams = get_new_guess(prevParams,prevResults);
    loop for nSims times,
      newResults = simulate_projectile_flight(newParams);
      newParams = get_new_guess(newParams,newResults);
    end
    fire_projectile(newParams);
    
    在这种情况下,变量nSims本质上是人工智能的“智能”度量。“哑”人工智能的nSims=0,只需在每个回合(基于前一回合的结果)进行新的猜测。“智能”人工智能将通过模拟射弹飞行来优化其每回合的猜测nSims次数

    这又引出了两个问题:

    1) “get_new_guess”功能有什么功能?我应该如何调整三个放炮参数以最小化到目标的距离?例如,如果一个放炮距离目标不远,您可以尝试通过仅调整仰角、仅调整射弹速度或同时调整这两个参数来使其更近


    2) 所有AI的get_new_guess是否应相同,nSims值是“intelligence”的唯一决定因素?或者get_new_guess是否应取决于另一个“intelligence”参数(如GuessAccurance)炮兵游戏和真实炮兵情况的区别在于,各方都有100%的信息,通常有两个以上的对手

    因此,你的评估功能应该考虑哪一个对手更紧迫的尝试和消除。例如,如果我在90%的时候有一个简单的杀戮,但是在试图杀死我的人身上,只有50%的几率在我身边错过了两个射门,那么处理这个机会就更重要了。
    我认为您需要某种方法来评估每个人在弹药、地点、活动、过去历史等方面对您造成的风险。

    我现在针对您发布的回复:

    虽然你有一个大致的想法,但我不相信你的方法是可行的——即使nSims的值很低,它也会收敛得太快。我怀疑你想要的get\n迭代不止一次