8

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

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

可能的原因:

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

算法是这样的:

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

我目前的设置:

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

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

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

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

4

2 回答 2

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) 结合起来,因为具有低交叉的遗传编程会找到非最优解。

于 2010-11-12T14:21:51.870 回答
2

你的突变大小让我吃惊地高。它还存在一些固有的偏差——当前值越大,突变越大。

你可能会考虑

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

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

于 2010-11-12T11:49:47.840 回答