MorvanZhou/Evolutionary-Algorithm

发现一些(可能的) BUG

mohanson opened this issue · 3 comments

第一个(可能的) BUG:
https://github.com/MorvanZhou/Evolutionary-Algorithm/blob/master/tutorial-contents/Genetic%20Algorithm/Genetic%20Algorithm%20Basic.py#L49

使用 repeat 导致初始种群所有个体都有相同的 DNA; 正确做法是 pop = np.random.randint(2, size=(POP_SIZE, DNA_SIZE)) 使种群每个个体拥有随机的基因;

第二个(可能的) BUG:
https://github.com/MorvanZhou/Evolutionary-Algorithm/blob/master/tutorial-contents/Genetic%20Algorithm/Genetic%20Algorithm%20Basic.py#L34

crossover 在求函数最大最小值一般采用单点交叉, 类似生物体染色体交叉, 而非对每一个基因座做交叉, 单点交叉示意如下

A: 10110111|00  crossover  A': 10110111|11
B: 00011100|11  -------->  B': 00011100|00

并且在做交叉时, 需要对个体进行两两配对, 而非从整体中随机选择, 这会导致群体内的部分已经过 select 个体繁殖几率不同. 从原理上来说, 经过 select 的个体必须拥有相同的繁殖几率.

你好,你提到的是在点上。其实在算法中,像你这样的调试是非常正常的也是可以采取的。遗传算的有非常多种设置个搭配方式。谢谢。

你好, 之所以我提出以上两点修改意见, 是因为我在运行你的代码时, 很大概率出现无法找到最优解的情况, 因此做了上述部分修改. 如果你有时间, 可以使用 np.random.seed(13) 运行你的代码, 可以复现求解失败的情况.

好的, 的确是有点问题, 我觉得pop = np.random.randint(2, size=(POP_SIZE, DNA_SIZE)) 这个是影响不收敛的重点. 我根据你的推荐更改了代码. 谢谢