我正在为零和 4 人棋盘游戏制作 AI。这实际上不是零和(4个玩家在失去所有生命时会“死亡”,所以会有一个玩家先死,第二个,第三个和一个活下来的玩家。但是,我告诉AI,只有幸存算作赢,其他任何事情都是输)经过一些研究,我想我会结合使用极大极小算法和启发式函数。我遇到了这个 question 并决定做与那个问题的 OP 相同的事情 - 编写一个进化算法,给我最好的权重。

但是,我的启发式函数与该问题的 OP 所具有的启发式函数不同。我的需要 9 个权重,而且速度要慢得多,所以我不能让代理玩 1000 场比赛(花费太多时间)或使用交叉方法培育它们(我如何进行 9 个权重的交叉?)。

所以我决定想出我自己的方法来确定健康和繁殖。而这个问题只是关于适应度函数。

这是我在这方面的尝试。

第一次尝试

对于随机生成的 50 个智能体中的每个智能体 A,从群体中再选择 3 个智能体(有替换但与 A 本身不同的智能体)并让这 4 个智能体玩 A 是第一个玩家的游戏。选择另外 3 个并玩一个 A 是第二个玩家的游戏,依此类推。对于这 4 个游戏中的每一个,如果 A 先死,它的适应度不会改变。如果A死第二个,它的适应度增加1。如果它死第三个,它的适应度增加2。如果它幸存下来,它的适应度增加3。因此,我得出结论,一个人可以得到的最高适应度是12(幸存/赢得所有 4 场比赛 -> 3 + 3 + 3 + 3)。

我跑了 7 代,从第一代开始,最高的适应度高达 10。我计算了前 10 名智能体的平均适应度,但在整个 7 代中平均值并没有增加一点。它甚至减少了一点。

我认为这行不通的原因是因为肯定有一些代理商很幸运,并且有一些表现不佳的代理商作为对手。

第二次尝试

游戏设置与我的第一次尝试相同,但我没有测量每场比赛的结果,而是决定测量该代理在死亡之前进行了多少次移动。

在 7 代之后,前 10 名的平均适应度确实增加了,但仍然没有我认为应该增加的那么多。

我认为失败的原因是游戏是有限的,所以在你死之前你可以做的 Action 是有限的,而表现最好的特工几乎达到了这个限制。没有增长的空间。另一个原因是幸存的玩家的体能与第三位死亡的玩家的体能相差不大。

我想要的是

根据我对 EA 的理解(如果我错了,请纠正我),平均适应度应该增加,而表现最好的个人的适应度不应该随着时间的推移而下降。

我的两次尝试都失败了。由于对手是随机选择的,第一代表现最好的智能体可能会在下一代得到更强大的对手,因此其适应度下降。

笔记

在我的尝试中,代理每代玩 200 场游戏,每一代最多需要 3 个小时,所以我不想让他们玩太多游戏。

我如何编写这样的适应度函数?

最佳答案

七代似乎还不足以获得有用的结果。特别是对于游戏,我希望像 200 多代这样的东西更逼真。你可以做很多事情:

  • 实现 elitism 以确保最佳个体的生存。
  • 进化的力量源于反复的变异和交叉,所以我建议让代理每代只玩几场比赛(比如 5 ~ 10),至少在开始时,然后进化种群。您甚至可能希望每一代只做一款游戏。
  • 对此,你可以采取持续进化的策略。这意味着一旦代理死亡,它们就会受到变异,而一旦代理获胜,它们就可以产生后代。或者两者的任意组合。关键是比赛正在进行中,每个人都可以与其他任何人比赛。这有点“有机”,因为它没有严格定义的世代,但它应该加快过程(特别是如果你可以并行评估)。

  • 我希望这有帮助。您引用的帖子中接受的答案对您可以实现交叉的方式提出了很好的建议。

    关于swift - 对于零和游戏的 AI 来说,什么是好的适应度函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46871501/

    10-16 19:45