我正在考虑为我可以实现的游戏提供AI。我的问题是要为该游戏找到一个评估函数,以便将minimax算法与alpha / beta切分一起应用。 https://en.wikipedia.org/wiki/Minimax https://en.wikipedia.org/wiki/Alpha%E2%80%93beta_pruning 让我首先描述游戏,解释我打算用AI实现的目标,然后解决问题。
游戏:
A 2-player turn-by-turn game.
Goal is to kill opponent or have more life points at the end.
In comparison with Magic: The Gathering, you both have monsters to attack the opponent. The number is fixed, let’s say 5 each.
A monster has a fight ability (let's say between 1 and 10), and a damage ability (let's say between 1 and 5).
Each turn:
- Active player declares to his opponent which monster (he owns) engages the current fight.
- He secretly sets multipliers face down (let’s see that in next paragraph).
- Opponent declares which monster (he owns) fights against the first one, while setting multipliers the same way.
- Fight: fight ability * multipliers = final attack. Biggest attack wins and inflicts damage ability to opponent.
- Next turn, active player switch
About multipliers: you have 4 cards in hand that can double your attack (and many empty cards, so that you put 4 cards each turn on the table, and the opponent does not know if you multiplied by 1, 2, 4, 8 or 16).
Just in case: let's say we have a rule for draws to be solved.
我对AI的期望: 能够说出一个完美的球员是否应该在给定的位置上获胜。这意味着,对于一个可获胜的职位,人工智能应该告诉人们有一种通往胜利的方法,并给出步骤(请参见下面的示例)。对于对手可获胜的位置,我尚未决定,对于在所有情况下都不会导致同一获胜者的位置(它们都存在; D),我也没有决定。
**示例:**
2 rounds left to go. I have
- Monster A: fight: 5, damage: 2
- Monster B: fight: 3, damage: 4
- life: 5, 1 multiplier left, my turn to begin
My opponent has
- Monster C: fight: 2, damage: 6
- Monster D: fight: 8, damage: 1
-life: 5, 1 multiplier left
In that case, if you think about it, you win if you play well.
Solution:
You can see that if monster C wins, he inflicts 6 and I lost.
But if he loses, one my monsters will inflict at least 2, and even if monster D wins (before or after),
I won't die and I will have more life that my opponent. Victory.
That's an example of what I want the AI to find.
当然,我简化了示例。也许会更棘手。这就是我的问题所在。
我们可以从精神上看到,当我们还有2局时,计算所有可能的对决很简单(最后一局不需要计算:两个都发挥最后的乘数是确定的)。 就像我们说的,我们还有5个回合。但是我的观点是,我们可能有20个,计算所有数据变得很长(例如试图在第一轮中寻找最佳举动)。 确实,我们不会尝试进行计算。例如,在国际象棋中,太多的位置导致无法计算所有可能性。
但是,如果您跟随我,国际象棋就有解决方案-我们可以实现评估功能。我们如何知道前进10个动作,这会导致更好的位置?因为我们评估这个位置。我们声称,如果是将军,或者如果您有更多棋子,或者如果您控制中心等,则该职位更好。
然后,我的问题在这里:
如何评估我介绍的游戏中的位置?
我的意思是,在第一轮中,如果我可以计算出下一轮的2步中可能的移动,那么我到达了第三轮或第四轮的所有可能位置。但是我认为这似乎没有帮助。您可以拥有更好的生活点,更好的卡牌,更多的左乘数,这一切都取决于接下来会发生什么。在一般情况下,我看不到具有优势的优势。那你呢?
N.B.1我希望很清楚,我简化了游戏规则,我们当然可以添加规则(如果连续两轮获胜,则组合,适用于伤害能力的乘数...)
N.B.2我想到了一个神经网络,但这个问题对我来说仍然很有趣。而且由于多次回合,神经网络似乎难以解决(我的知识比知道任何具有追溯作用的模型在神经网络中的知识要受限制得多。
N.B.3如果我仍然进行完整的计算分析,我认为minimax和alpha / beta削减将有所帮助,但是我担心的是计算时间,这就是为什么我在这里问这个问题。我可能可以从对最后2个回合位置的完整计算开始,是的。
感谢阅读,希望您能像我一样刺激这个问题!
答案 0 :(得分:1)
评估任何游戏中位置的一种方法是尝试了解被认为是游戏专家的玩家的思维过程。因此,您可以在此游戏中找到专家,并向他们询问决定他们在游戏中做出决定的因素。或者,您可以通过学习游戏并进行大量游戏来自己成为专家。仅查看游戏规则很难提供良好的评估功能。
我还没有玩过这个游戏,但是从一些简单的启发式游戏开始可能是有意义的,这是确定游戏状态的变量的线性组合(主要角色的健康点,拥有的乘数,总战斗力) /您所有怪物的伤害能力,任何怪物的最大战斗/伤害能力,左转次数等)。考虑对手的相应值,您将获得如下评估函数:a1*(my_hp - opp_hp) + a2*(my_monsters_total_fight - opp_monsters_total_fight) + a3*(my_monsters_total_damage - opp_monsters_total_damage) + a4*(my_number_of_multipliers - opp_number_of_multipliers) + ...
,其中系数a1,a2,..
可以为正值或负值,具体取决于相应变量的影响(例如,系数hp
变量a1
的正数等)
现在,此功能可能会起作用,也可能不会起作用,但至少它将为您提供一个起点,您可以尝试从中改进它,或者如果它不幸失败则将其完全丢弃。您可以尝试通过调整系数,添加一些非线性项以在变量(乘法,幂,对数等)之间产生更复杂的关系,来改善此评估函数,并查看其如何影响性能。您也可以尝试使用遗传算法和差异进化等优化技术来自动化调整过程。总的来说,提出一个好的启发式方法可能更像是一门艺术而不是一门科学(毕竟,出于某种原因,它被称为启发式方法)。从反复试验开始,看看它如何进行。