【问题标题】:Genetic algorithm for a card game (Dominion)纸牌游戏的遗传算法(Dominion)
【发布时间】:2012-06-07 17:26:49
【问题描述】:

我有一个运行 Dominion 的有效 F# 程序,这是一个纸牌游戏。我想使用遗传算法来确定最佳的游戏策略。但是,我对人工智能或遗传算法知之甚少。你能指点我一些好的文学作品吗?

游戏策略包括对给定手牌的反应。在每一轮中,机器人都会得到一手牌。它可以根据已处理的内容选择玩行动牌或购买新牌。我们的目标是用尽可能多的胜利点卡结束游戏。

硬编码方法可能类似于:

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 对抗各种其他机器人的平均得分。 (一个机器人的分数取决于它与谁比赛,但希望通过与许多机器人进行多次比赛,这可以平衡。)

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

【问题讨论】:

  • 对不起,但 IMO 对您的问题的描述非常糟糕。我什至不知道你为什么要“组合”两个机器人,或者你想组合哪些机器人。我假设动作卡是在游戏过程中变化的动态属性。请根据目标函数和您的决策变量更清楚地说明问题。我假设您想训练您编写的通用机器人的一些参数。也许您可以再详细说明一下。你是用什么编程语言写的纸牌游戏模拟器?
  • 我同意我没有很好地表达这个问题。我又试了一次;这看起来怎么样?
  • 绝对值得多花一点时间

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


【解决方案1】:

Dominion 是一款很棒的游戏,但很难使用遗传算法进行优化,因为任何给定游戏的输入因游戏(使用的卡组)而异,最佳策略会在游戏过程中发生变化,以及任何给定情况下的最佳玩法只会慢慢出现在基因搜索中(直觉上,基于我对 GA 和游戏的非常好的理解)。

我认为,更好的 Dominion 方法要么是直接启发式(基于规则)的方法,要么是非常有趣的 Monte Carlo Search(例如,参见http://cacm.acm.org/magazines/2012/3/146245-the-grand-challenge-of-computer-go/fulltext)。蒙托卡洛搜索之所以吸引人,正是因为:

  • 在 Dominion 中很容易生成随机但合法的移动序列。
  • 至少可以直接判断这样一个序列的“价值”(增加 VP)
  • 先验构建“最佳游戏”规则很难(这就是游戏如此出色的原因)

这是一个很好的挑战——你应该在博客上写下你的经历。

【讨论】:

    【解决方案2】:

    你从哪里画出其他机器人?你让它们保持静止吗?如果是这样,受过训练的机器人本身不会“擅长”游戏,只会擅长利用虚拟机器人。如果不是,那么其他机器人也会发展,除非有其他限制,否则胜率将不是质量的良好指标。永远要意识到,在一群拥有完美技能的机器人中,他们的表现会显得平庸!

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

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

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

    • 根据您对游戏的了解,制作一个具有看起来不错的手工策略的机器人
    • 或者,让人类玩家(您自己?)提供动作。对于您的机器人来说,这可能是一个很好的培训经验来源,但除非您可以访问包含(专家)人类动作的大型数据库,否则它会非常缓慢。
    • 根据您的基准进行训练
    • 选择表现最好的人,变异等

    【讨论】:

      【解决方案3】:

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

      在每个回合中,您都持有一组牌,并且您想确定要打出的牌,或者在您不打出的牌的情况下,您想抓一张新牌。你需要的是某种优先级函数,它告诉你哪张牌最好玩。这样的优先功能可以通过遗传编程来描述。您将始终使用具有最高优先级的卡,除非没有卡的优先级高于设定的级别(例如 0),在这种情况下您会抽一张新卡。遗传编程可用于进化该优先功能。

      由于您使用的是 F#,因此使用用 C# 编写的 HeuristicLab 尝试这种方法可能是个好主意。您可以在那里将您的程序作为一个问题来实现,并让评估函数执行该游戏的模拟。为您的规则编写语法和解释器。定义一些参数,使您的优先级规则能够做出有意义的决定,例如一些一般的游戏信息,例如打出的牌数、剩余省份等,以及一些与牌相关的信息,例如打出该牌的影响(以赢分为单位)等。这些是您的解释器的输入变量,它们将计算优先级值。具有最高优先级值的卡是您选择的卡。然后评估您的策略定义例如10 个随机解决方案,当您创建此类问题并在评估中让每个解决方案与该随机机器人竞争。测量你击败每个随机机器人的数量,你赢的越高,你击败的机器人越多,适应性越好,他们赢的越多,得分越差。然后,您还可以为您的问题添加一个分析器,该分析器将使用性能最佳的解决方案更新问题的随机解决方案,以便您随着时间的推移不断改进这些解决方案。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-23
        • 1970-01-01
        • 2011-08-26
        • 2011-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多