c# - 遗传算法中的锦标赛评估

标签 c# genetic-algorithm geneticsharp

现在,每个遗传 C# 库(A.Forge、遗传算法框架、GeneticSharp)似乎只评估单个 Chromosome,然后使用各种选择方法之一来创建新一代.

由于我的问题涉及两个 AI 相互对抗,因此单独评估它们的适应性有点困难。虽然游戏足够简单,可以创建一些表面障碍(AI 不直接交互,但障碍会发送给其他游戏),这会让我获得一些抽象的适应性,但这并不是“真正的”交易.

这些库似乎也没有提供我可以实现这种评估方法的另一个接口(interface)。是否有其他框架允许这样做,还是我需要从头开始?

最佳答案

每个遗传算法库都应该有一些方法供您定义适应度函数,这正是您要找的。 AForge.NET 公开了 IFitnessFunction界面。 GeneticSharp 公开了 IFitness界面。是的,您必须自己编写适合度函数的代码——这是您的问题领域所特有的部分。您可以根据需要使其变得简单或复杂。

在每条染色体通过适应度函数并分配一个分数后,系统会使用您喜欢的任何选择标准(锦标赛、轮盘赌等)来选择哪些染色体通过交叉和/或变异进入下一代.

因此,与其像这样流程:

  1. 匹配当前世代的染色体
  2. 每对染色体玩一轮
  3. 获胜者创造下一代

遗传算法是这样工作的:

  1. 每条染色体玩一轮并获得分数
  2. 选择算法使用该分数选出总体获胜者
  3. 获胜者创造下一代

本质上,每条染色体都已经在与其他所有染色体竞争,只是比你我玩游戏要抽象一步。

您可能会操纵适应度函数,将当前种群中的其他随机成员拉入作为对手。更好的办法是使用上一代最好的染色体作为整个当前一代的对手。

为您的染色体分配点数以在游戏中取得进一步进展,并为对手制造障碍奖励点数(如果这是与您游戏中的正常游戏玩法不同的独特 Action )。返回染色体的最终得分作为适应度函数输出。

关于c# - 遗传算法中的锦标赛评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32050232/

相关文章:

c# 字符串到 html 保持空白?

c# - orderby 语句使用 First() 方法调用,为什么需要它?

c# - 如何填充 C# Windows 窗体组合框?

lambda - 如何生成和运行随机 lambda 表达式?

android - 如何在android中应用Straight Skeleton Algorithm

c# - 如何计算所需的总位数?

geneticsharp - Genetic Sharp - 约束下的优化

c# - 使用 FieldInfo.SetValue 与 LINQ 表达式在结构中设置字段

genetic-algorithm - 预置遗传算法