我有一个种群为X的遗传算法(GA)。
在我运行基因并获得每个基因的结果后,我对基因进行了一些加权乘法操作(因此,排名较高的基因被乘以的次数最多)。
我得到的基因数量要么是x*2,要么是x*2+(x*100/10)。这10%是随机的新基因,根据突变率可能会或可能不会触发。
问题是,我不知道将种群再次减少到X的最佳方法是什么。
如果基因是一个列表,我应该只使用list[::2](或从列表中获取所有偶数索引的项目)吗?
在交叉基因时,常见的做法是什么?
编辑:
我的GA的示例,种群为100;
- 在适应度函数中运行100个基因并获取结果。当前种群:100
- 添加10%的新随机基因。当前种群:110
- 复制排名前10%的基因。当前种群:121
- 移除排名最差的10%的基因。当前种群:108
- 组合所有可能的基因(无重复)。当前种群:5778
- 从基因库中移除基因,直到种群=100。当前种群:100
- 重新开始适应度函数
我想知道的是:我应该如何执行最后一步?目前我有一个包含5778个项目的列表,我每隔’58’取一个,或者表示为len(list)/startpopulation-1
或者我应该使用一个’while True’循环并随机删除,直到len(list) == 100?
新的随机基因应该在交叉之前还是之后添加?
是否有办法对从最高到最低评级的项目进行高斯乘法?
例如:排名最高的乘以n,第二好的乘以(n-1),第三好的乘以(n-2)……,排名最差的乘以(n-n)。
回答:
我真的不明白你为什么要这样执行GA,你能提供一些参考资料吗?
无论如何,以下是我实现功能性GA方法的典型解决方案:
-
在适应度函数中运行100个基因并获取结果。
-
根据归一化的适应度函数随机选择2个基因(考虑这是从基因池中选择每个基因的概率)并进行交叉。重复此步骤,直到你有90个新基因(在这种情况下是45次)。保存前5个不做修改并复制。总基因数:100。
-
对于新池中的90个新基因和5个复制品,根据你的突变概率(通常为1%)允许它们突变。总基因数:100。
-
从1)到3)重复,直到收敛,或X次迭代。
注意:你总是希望保持最佳基因不变,这样你每次迭代都能得到更好的解决方案。
祝你好运!