我只想知道街机/策略游戏中使用的各种AI算法或逻辑,用于查找/选择攻击单个单位的最佳目标。
因为,我不得不写一个小的AI逻辑,他们将成为一组单位受到各种油轮的攻击,所以我陷入了获得更好的逻辑或算法来选择一个单位的最佳目标攻击到油轮。
可获得的数据是: 油轮位置,射程,生命值,伤害。
请任何人知道最合适的算法/逻辑来解决这个问题,尽早回应。
提前致谢, Ramanand。
答案 0 :(得分:6)
我将以类似于RPG游戏玩家的观点来表达这一点:
为了对其他敌人造成严重打击,你会先打倒什么角色?打倒党的治疗师是常识,因为他们可以治愈团队的其他成员。一旦治疗师离开,该团队需要使用药物 - 这种药物供应有限 - 一旦药物耗尽,该方就会被搞砸。
类似的逻辑将适用于坦克计划。在您的AI中,您需要确定哪些坦克为用户的车队提供最大的力量和支持,并首先消除它们。除非他们在实现目标方面变得至关重要,否则不要专注于任何其他坦克:首先杀死该团队中最强大,最有用的成员。
所以我要打破我认为最有可能属于坦克属性的东西。
RANGE: Far range tanks can hit from a distance but have weak STRENGTH in their attacks.
TANKER POSITION: Closer tanks are faster tanks, but have less STRENGTH in their attacks. Also low HITPOINTS because they're meant for SPEED, and not for DAMAGE.
TANKER HP: Higher HP means a slower-moving tank, as they're stronger. But they won't be close to the front lines.
DAMAGE: Higher DAMAGE means a STRONGER tank with lots of HP, but SLOWER as well to move.
所以,如果我是你,我会首先关注具有最高HP /最强攻击的坦克,然后是最接近的坦克,然后担心远程坦克 - 无论如何你都无法对它们做任何事情。他们进入你的攻击半径:P
算法非常简单。如果你在派对中有一个坦克列表,为它们创建一个自定义排序(使用CompareTo)并按类别将坦克与最高可能的HP排序到列表顶部,然后是坦克,其焦点是速度,然后范围。
然后浏览列表中的每个项目。如果有可能攻击坦克(0),攻击。如果没有,请转到坦克(1)。
答案 1 :(得分:4)
目标是一次只攻击一个对手并且一次最多只有一个敌人受到攻击(但最好是没有)。
理想情况下,你会通过留在掩护后面并用突然袭击侧翼攻击坦克。这允许你一次一个地摧毁坦克,同时不接受或几乎没有火。
如果你没有掩护,那么你应该使用敌人作为掩护。进入一个将敌人置于敌人后方的位置。这也提高了你击中的机会。
你也可以使用射程来减少多个敌人的射击。撤退,直到你只在一个敌人的范围内。
如果敌人全部射击你,你想攻击一个目标,直到它不再是一个威胁,然后继续前进到下一个目标。目标是尽快减少你收到的火力。
如果同时有多个敌人射击你,并且你可以选择你的目标,你应该射击能够以最低成本减少最多伤害的目标。简单地将击中点除以伤害,并攻击具有最小结果的击中点。您还应该计算任何其他相关统计数据。范围可能同样影响你和敌人,但考虑到能够避开火焰的能力,更接近的敌人更有害,并且应该在计算中给予一定的重量。
如果移动减少被击中的可能性,那么你应该保持移动,通常是通过盘旋你的对手留在他们的侧翼。
团队策略主要包括侧翼和转移。
什么是弹药情况,是否有可能错过一个固定的目标?
答案 2 :(得分:1)
根据您的评论,听起来您已经拥有一些特殊的规则或启发式方法,可以根据您自己的衡量标准为您提供大约70%的成功,并且您希望进一步优化这一规则以获得更高的赢率。
作为一般解决方法,我会使用hill-climbing algorithm。由于我不知道当前算法的细节是否是70%成功率的原因,我只能用抽象的术语来描述如何适应爬山以优化算法。
爬山的一般原则如下。希望您当前算法的某些数字参数的微小变化将导致所得成功率的小(有希望线性)变化。如果这是真的,那么您将首先参数化当前的规则集 - 这意味着您必须在当前算法中决定可以调整和优化哪些数字参数以获得更高的成功率。一旦你确定它们是什么,学习过程就是直截了当的。从您当前的算法开始。使用稍微调整过的参数生成各种新算法,然后运行模拟来评估这组新算法的性能。选择最好的一个作为下一个起点。重复此过程,直到算法无法更好。
如果您的算法是一组if-then规则(包括规则匹配系统),并且提高性能涉及重新排序或重组这些规则,那么您可能需要考虑genetic algorithms,这是一点点更复杂。要应用遗传算法,必须定义突变和交叉算子,以便突变或交叉的单个应用导致整体性能的微小变化,而许多突变和交叉应用导致整体变化很大你的算法的性能。我不是这个领域的专家,但是当你谷歌“决策树上的遗传算法”时,应该会有很多。要避免的缺陷是,如果您只是考虑在变量操作符的决策树中交换分支,则单个应用程序可能会修改决策树的根,从而产生巨大的性能差异。这通常会为遗传算法增加太多噪音,所以我在这种方法中的建议是对操作员的编码要非常小心。
请注意,这两种方法是非常流行的AI方法,用于学习或改进您当前的算法。您可以完成所有这些模拟并离线学习。然后,您只需部署生成的学习算法。