MorvanZhou/Evolutionary-Algorithm

关于变异强度的自适应

igo312 opened this issue · 6 comments

在代码的进化中,我认为变异强度并不是自适应地往低值走,它主要还是决定于最初达到峰值的学习点对应的'mut_strength‘,在basic和(1+1)中都可以体现(我是进行了输出。结果只是趋向于某一个值而已),我的想法是DNA与函数峰值的差去决定变异强度(当然这只能用于这两个代码)。如果我的想法有错误,也请你告诉我,谢谢!

哦,对不起,我写的(1+1)中变异强度方法与basic中相同。但是basic中的变异强度我认为不会因为收敛而减小

basic 中的变异强度是自己调整的, 有点像"适者生存不适者淘汰"的方式选择合适的变异强度. (1+1)ES的变异强度不是这样的. (1+1)ES 是根据收敛来自适应变异强度

对的,但是你的进化策略教程里就有点问题了呢,你说了可以收敛时变异强度会减弱。

恩,这节内容就是一种适者生存的方式。

'ks[:] = np.maximum(ks + (np.random.rand(*ks.shape)-0.5), 0.) # must > 0
kv += ks * np.random.randn(*kv.shape)'

这两行内容就是在调整 ks (kid mutation strength),这种调整会放到kill bad中进行过滤。其他人可能不这么用,但是我觉得这样也是合理的,用这种方式来控制变异强度,最终控制的结果基本上都是越收敛,变异强度越小,因为变异强度大的话很有可能就带来不好的fitness, 不好的fitness会被淘汰掉,所以快收敛时,变异强度也会跟着越筛选越小

我认为这是不合理的,kill_bad方法是对pred值的大小以排序的形式进行筛选,只要pred越大,就能保留下来,所以只要达到顶峰,这个parent就会保留下来,即使之后变异强度变小,但导致的是值也变小所以没有用处。即我的观点是最后结果的变异强度只跟第一个达到峰值的parent有关,可能存在其他的变异强度,但是大部分将与第一个相同。对其我进行了输出了,但是我不知道怎么贴图,所以我只能写下我的理论,谢谢!

我理解你的顾虑, 我的编法应该不能理论上的解决这个问题. 如果要完善这个程序, 还是要把 mutation strength 考虑到 kill_bad 功能里. 谢谢指出存在的问题.