几个月前,我做了一个遗传算法,但结果证明我在解决任何问题上都非常努力。我最初的目标是在游戏应用中使用遗传算法
现在我正在重新创建整个过程,并试图从另一个角度来看待这个问题。
现在我将定义设置下一代的步骤。
我最后的想法是:
>
从当前世代中获得最高评级的基因,并在下一代中复制它们(数量由精英设置)
取两个随机基因进行交叉(选择的机会与基因等级相关),我做了几种交叉方法(一点、两点、三个父母、平均、均匀…)
用上述方法给新一代注入基因
对基因应用一些突变(被选择的几率由突变率决定),它只会改变部分DNA(排名靠前的基因除外)
这被证明是非常低效的(我不知道为什么),而且非常需要计算,因为交叉过程在所有基因上循环了好几次。
现在我在用一种新的方法思考。
基本上,我的目标是保持基因,去除“坏”基因,用交叉基因填满基因库。
在有1000个个体的基因库中,我会:
>
丢弃排名最低的500个。
复制最高评级(在10%精英主义中为100)
使用交叉产生400个新基因。
应用突变
我把“世代”的概念太字面化了,让他们都死了(期待最高评级的人),现在我会让他们都活着,期待糟糕的人。并根据需要重新填充。
我遗漏了什么吗?这种新方法会更好吗?
有一种替代垂直基因转移(传统的世代概念)的方法,即水平基因转移(见本文)。通过水平基因转移,种群大小在整个模拟过程中保持不变。
此外,当你培育基因型时(无论你选择哪种方法),你绝对不应该在几代人中只保留最合适的候选人。如果您这样做,您找到的解决方案很可能是局部最优的。每个基因型都应该有机会传给下一代,适者生存的人有更好的机会(参见关于线性排序选择的答案)。