【问题标题】:Optimal population size, mutate rate and mate rate in genetic algorithm遗传算法中的最优种群规模、突变率和交配率
【发布时间】:2011-05-08 23:49:09
【问题描述】:

我为一场比赛编写了一个游戏程序,它依赖于一些 16 个浮点“常量”。改变一个常数可以并且将会对演奏风格和成功率产生巨大的影响。

我还编写了一个简单的遗传算法来生成常数的最佳值。然而,该算法不会生成“最佳”常量。

可能的原因:

  • 算法有错误(暂时排除这个!)
  • 人口太少了
  • 变异率太高了
  • 交配率可能会更好

算法是这样的:

  • 首先创建初始种群
  • 分配了每个成员的初始常数(基于我的偏差乘以 0.75 和 1.25 之间的随机因子)
  • 每一代人口中的成员都会配对进行游戏匹配
  • 获胜者被克隆两次,如果平局则被克隆一次
  • 如果 random() 小于突变率,则克隆会突变一个基因
  • 变异将随机常数与 0.75 到 1.25 之间的随机因子相乘
  • 以固定的时间间隔,根据交配率,成员配对并混合基因

我当前的设置:

  • 人口:40(低)
  • 变异率 0.10 (10%)
  • 交配率 0.20(每 5 代)

种群规模、变异率和交配率的更好值是多少?

欢迎猜测,不期望确切的值! 另外,如果您对类似的遗传算法有见解,也愿意分享,请这样做。

P.S.:有问题的游戏比赛,如有兴趣:http://ai-contest.com/

【问题讨论】:

标签: genetic-algorithm genetic-programming


【解决方案1】:

你的突变大小让我吃惊地大。它也有一些固有的偏差 - 当前值越大,突变越大。

你可以考虑

  1. 有一个(很多!)较小的突变
  2. 给突变一个固定的范围
  3. 以不同方式分配突变大小 - 例如您可以使用均值为 1 的正态分布。

R.A.费舍尔曾经将突变大小与聚焦显微镜进行比较。如果你改变焦点,你可能会朝着正确的方向前进,也可能是错误的方向。但是,如果您非常接近最佳状态并且经常转动它 - 要么你会走错方向,要么你会超过目标。因此,更细微的调整通常会更好!

【讨论】:

  • 更高的人口、更低的变异率和 14 小时的计算得到了很好的结果,但我仍然不得不手动调整两个常数。它给了我 200 分!
  • 偏差:如果常数值越大,突变越大,正确。但该值的不确定性也较高,突变的相对变化相同(小于25%)。我认为这不重要。
【解决方案2】:

使用 GAUL 框架,非常简单,因此您可以提取目标函数并将其插入 GAUL。如果您有一台多核机器,那么您可能希望在编译时使用 omp (openMP) 来并行化您的评估(我认为这很耗时)。这样你就可以拥有更大的人口规模。 http://gaul.sourceforge.net/

通常他们使用高交叉和低突变。既然你想要创意,我建议你高突变低交叉。http://games.slashdot.org/story/10/11/02/0211249/Developing-emStarCraft-2em-Build-Orders-With-Genetic-Algorithms?from=rss

在你的变异函数中要非常小心,以保持你的空间搜索(在 0.75, 1.25 内)。使用 GAUL 随机函数,例如 random_double( min, max )。它们设计得非常好。构建自己的变异函数。确保父母死去!

然后您可能希望将其与包含在 GAUL 中的单纯形 (Nelder-Mead) 结合起来,因为具有低交叉的遗传编程会找到非最优解。

【讨论】:

  • GAUL 对于手头的问题似乎有点大。我目前的基因引擎是 110 行 Python 代码。我确实很喜欢您的建议和链接,谢谢。
  • 留在搜索空间:我不检查,如果一个常数值跳出,游戏“有机体”会发送非法命令,因此它会死。
  • 好的那你可以考虑拉马克(对所有个体的重新评估)
  • 在拉马克遗传学中,个体会将其在其一生中获得的一些特征传递给他们。这如何适用于游戏,“内容”在游戏过程中不会改变?
  • 您可以做一个漂移(将数字更改为接近的数字),然后看看它是否是一个很好的适应。
猜你喜欢
  • 1970-01-01
  • 2014-02-07
  • 2011-02-22
  • 2011-10-11
  • 2016-09-05
  • 1970-01-01
  • 2014-12-21
  • 2013-08-09
  • 1970-01-01
相关资源
最近更新 更多