swift - 对于零和博弈的 AI,什么是好的适应度函数?

标签 swift artificial-intelligence evolutionary-algorithm fitness

我正在为零和 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 名的平均适应度确实增加了,但仍然没有像我认为的那样增加。

我认为失败的原因是游戏是有限的,所以你在死前可以移动的次数是有限的,而表现最好的代理人几乎达到了这个限制。没有成长空间。另一个原因是,幸存者的 body 素质与第三名死亡的球员 body 素质相差不大。

我想要什么

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

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

注意事项

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

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

最佳答案

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

  • 实现 elitism以确保最佳个体的生存。

  • 进化的力量源于反复的变异和交叉,所以我建议让智能体每代只玩几次游戏(比如,5 ~ 10),至少在开始时,然后进化人口。您甚至可能希望每一代只玩一款游戏。

  • 在这方面,您可以采用持续进化策略。这意味着一旦代理人死亡,他们就会发生变异,而一旦代理人获胜,他们就会产生后代。或者两者的任意组合。重点是比赛正在进行中,每个人都可以与其他任何人比赛。从没有严格定义世代的意义上说,这更“有机”一点,但它应该会加快这个过程(尤其是如果你可以并行评估的话)。

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

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

相关文章:

Swift TableView 插入新行

javascript - 为瓷砖游戏制作 AI

iphone - 如何在 Cocos2d 中创建 AI?

c - 我的遗传算法 C 代码不起作用,它不进入 if 条件

artificial-intelligence - 确定在进化算法中要加权的输入

java - 是否可以扩展解决方案类?

ios - 如何在自定义函数中添加函数作为参数 - swift?

ios - IMFPush Bluemix 无法在 Swift 2.2 上运行(i386 错误)

ios - 从同一范围调用 block /闭包

python - 是否可以利用 Windows 10 的 Cortana API for Python?