纸牌游戏的遗传算法(Dominion)

时间:2012-06-03 03:54:44

标签: f# artificial-intelligence genetic-algorithm playing-cards

我有一个运行F#程序,运行卡片游戏Dominion。我想用遗传算法来确定最佳的游戏策略。但是,我对AI或遗传算法知之甚少。你能指点一些好的文献来开始吗?

比赛的策略包括对特定牌的反应。在每个回合中,机器人都会获得一手牌。它可以根据已经处理的内容选择玩动作卡或购买新卡。目标是尽可能多的胜利点牌结束比赛。

硬编码方法可能类似于:

def play(hand, totalDeck):
    if hand contains Smithy then use Smithy
    if hand contains enough coins for Province then buy Province
    if more than 30% of the totalDeck is Smithy, then buy coins

我正在考虑根据每张卡片的总牌组的目标部分向量来描述策略:

[Smithy, Province, Copper, ...]
[.3, .2, .1, ...]

然后改变机器人,我可以改变那个向量,看看变异版本是否做得更好。健身功能将是玩Dominion对抗各种其他机器人的平均分数。 (一个机器人的得分取决于它与谁对抗,但希望通过对许多机器人玩很多游戏,这甚至可以解决。)

这有意义吗?我走的是正确的道路吗?

3 个答案:

答案 0 :(得分:5)

Dominion是一款出色的游戏,但使用遗传算法很难进行优化,因为任何给定游戏的输入在游戏(使用的卡集)之间有所不同,最佳策略在游戏过程中会发生变化,以及对于任何给定情况的最佳游戏只会慢慢地出现在遗传搜索中(直观地,基于我对GA和游戏的非常好的理解)。

我认为,对Dominion更好的方法是直接启发式(基于规则)方法,或者非常有趣的是,蒙特卡罗搜索(例如,参见http://cacm.acm.org/magazines/2012/3/146245-the-grand-challenge-of-computer-go/fulltext)。蒙托卡罗搜索的吸引力正是因为:

  • 在Dominion中生成随机但合法的动作序列很容易。
  • 至少可以直截了当地判断这样一个序列的“价值”(增加VP)
  • 先行建立“最佳游戏”规则很难(这就是让游戏如此美好的原因)

这是一个非常好的挑战 - 你应该博客你的经历。

答案 1 :(得分:4)

你从哪里画出其他机器人?你把它们保持静止吗?如果是这样,训练有素的机器人本身就不会变得“好”,只是善于利用虚拟机器人。如果没有,那么其他机器人也会进化,除非适用其他一些限制,否则胜率不会是质量的良好指标。始终意识到,如果人口中充满了技能完善的机器人,他们彼此之间的表现就会显得平庸!

你可以采取共同进化的方法:

  • 在足够大的人群中突变所有机器人。
  • 让他们在循环赛中反复竞争,例如100次
  • 消除一些表现最差的机器人,
  • 保持一些最好的机器人不变( elitism
  • 为其他人群补充突变和好机器人的交叉。

或者你可以针对固定基准进行训练:

  • 使用您对游戏有所了解的手工策略制作机器人
  • 或者,让人类玩家(你自己?)提供动作。这可能是您的机器人培训体验的良好来源,但除非您可以访问大型(专家)人类移动数据库,否则它非常慢。
  • 训练你的基准
  • 选择表现最佳,变异等

答案 2 :(得分:2)

我认为除非游戏非常线性,否则矢量不会真正产生好的结果。我建议采用以下基于规则的方法:

在每个回合中,您持有一组牌,并且您想要确定您所玩的牌,或者如果您没有玩一张想要画一张新牌的牌。你需要的是某种优先功能,可以告诉你最好玩哪张牌。这种优先功能可以通过遗传编程来描述。您将始终以最高优先级播放该卡,除非没有卡的优先级高于设定级别(例如0),在这种情况下您将绘制一个新卡。遗传编程可用于发展该优先功能。

由于您正在使用F#,因此使用C#编写的HeuristicLab尝试此方法可能是个好主意。您可以将程序实现为问题,并让评估功能执行该游戏的模拟。为你的规则写一个语法和一个翻译。定义一些参数,使您的优先级规则能够做出有意义的决策,例如:一些一般的游戏信息,如玩牌数量,省份等等,以及一些与卡相关的信息,如玩牌的影响(在胜利点方面)等。这些是你翻译的输入变量,计算优先级值。具有最佳优先级值的卡是您选择的卡。然后评估您的策略定义,例如当您创建这样的问题并在评估中让每个解决方案与该随机机器人竞争时,有10个随机解决方案。测量你击败每个随机机器人的数量,你赢得的越高,你击败的机器人越多,健身越好,他们赢得的越多,得分越差。然后,您还可以在问题中添加一个分析器,该分析器将使用性能最佳的解决方案更新问题的随机解决方案,以便随着时间的推移逐步发展。

如果您愿意,也可以使用目标部分的想法。在这种情况下,您的编码将是RealVector。您还可以使用HeuristicLab进行优化(使用Evolution Strategy,粒子群优化或遗传算法)。