【发布时间】:2015-02-16 03:24:20
【问题描述】:
几个月前我做了一个遗传算法,但结果证明我在解决任何类型的问题方面都非常周到。我最初的目标是在游戏应用程序中使用遗传算法
现在我正在重新创建整个事物并尝试从另一个角度看待问题。
现在我要定义设置下一代的步骤了。
我最后的想法是:
从当前一代中取出评分最高的基因,并在下一代中复制它们(数量由精英设定)
随机取两个基因进行交叉(被选中的几率与基因等级相关),我做了几种交叉方法(一点,两点,三亲,平均,制服...)
用上面的方法给新生代填充基因
对基因应用一些突变(被选中的机会由突变率决定),它只会改变部分DNA(排除最高评分的基因)
这被证明是非常低效的(我不知道为什么),而且由于交叉过程多次循环遍历所有基因,因此对计算的要求也很高。
现在我正在考虑一种新方法。
基本上我的目标是保持基因并去除“坏”基因,并用交叉基因填充基因库。
在拥有 1000 个人的基因库中,我会:
丢弃排名最低的 500 个。
复制最高评分(在 10% 的精英主义中,它是 100)
使用交叉生成 400 个新基因。
应用突变
我太从字面上理解“世代”的概念,让他们都死去(期待最高评价的那些),现在我会让他们都活下去,期待坏的。并根据需要重新填充。
我错过了什么吗?这种新方法会更好吗?
【问题讨论】:
-
你的想法 1 和 2 的概念算法对我来说看起来不错。如果您遇到效率低下的问题,我会调查这些想法的实施。请记住,遗传算法不是万无一失的解决方案。由于“最佳”遗传算法没有神奇的数字,因此必须调整所有控制参数。也许增加种群规模,也许看看停止标准(你进化了太多代而收获很少?),也许更多的突变,也许更少。
-
也许我的实现是问题的原因,但我不太确定,我重写了几次代码。 GA 的问题在于难以调试,因为唯一改变的是基因,而且它们都是“随机的”。关于调整,是的,我没有对此进行太多实验,我遵循了我在互联网上找到的一些指导方针。
-
放弃最差的一半人口并不是最好的主意。这会很快导致过早收敛。我建议看一下选择算法。我在锦标赛选择方面有很好的经验。它非常容易实现,并且通常比普通的健身比例选择效果更好。它还具有最坏的人无法生存的特性。
-
另一个可能导致性能不佳的因素是基因型-表型映射。如果您的解决方案的遗传编码非常间接,那么 GA 可能很难找到解决方案。如果基因型的微小变化导致表型发生巨大变化(实际解决方案),那么交叉和突变就不能很好地发挥作用。