现在,每个遗传 C# 库(A.Forge、遗传算法框架、GeneticSharp)似乎只评估单个 Chromosome
,然后使用各种选择方法之一来创建新一代.
由于我的问题涉及两个 AI 相互对抗,因此单独评估它们的适应性有点困难。虽然游戏足够简单,可以创建一些表面障碍(AI 不直接交互,但障碍会发送给其他游戏),这会让我获得一些抽象的适应性,但这并不是“真正的”交易.
这些库似乎也没有提供我可以实现这种评估方法的另一个接口(interface)。是否有其他框架允许这样做,还是我需要从头开始?
最佳答案
每个遗传算法库都应该有一些方法供您定义适应度函数,这正是您要找的。 AForge.NET 公开了 IFitnessFunction界面。 GeneticSharp 公开了 IFitness界面。是的,您必须自己编写适合度函数的代码——这是您的问题领域所特有的部分。您可以根据需要使其变得简单或复杂。
在每条染色体通过适应度函数并分配一个分数后,系统会使用您喜欢的任何选择标准(锦标赛、轮盘赌等)来选择哪些染色体通过交叉和/或变异进入下一代.
因此,与其像这样流程:
- 匹配当前世代的染色体
- 每对染色体玩一轮
- 获胜者创造下一代
遗传算法是这样工作的:
- 每条染色体玩一轮并获得分数
- 选择算法使用该分数选出总体获胜者
- 获胜者创造下一代
本质上,每条染色体都已经在与其他所有染色体竞争,只是比你我玩游戏要抽象一步。
您可能会操纵适应度函数,将当前种群中的其他随机成员拉入作为对手。更好的办法是使用上一代最好的染色体作为整个当前一代的对手。
为您的染色体分配点数以在游戏中取得进一步进展,并为对手制造障碍奖励点数(如果这是与您游戏中的正常游戏玩法不同的独特 Action )。返回染色体的最终得分作为适应度函数输出。
关于c# - 遗传算法中的锦标赛评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32050232/