我有一个关于遗传算法突变的抽象问题。我没有包含任何代码片段来独立于编码环境提出我的问题。
我正在编写遗传算法代码,但我不知道如何实现变异。假设一个将要变异的后代是一个像10110011110101000111
这样的长度为20的字符串。
突变必须以非常小的概率进行,例如0.001。我们产生一个介于0和1之间的随机数,然后我们决定是否应该改变后代。我的问题是,我们必须生成20个随机数,并为这个后代的每20位做出有关变异的决定吗?或者我们必须为整个后代只生成一个随机数并随机切换一下?
换句话说,后代中的每个位是否有机会根据生成的随机数进行变异,或者只有一位有可能发生突变?
答案 0 :(得分:2)
“传统上”变异率pmutation
(David E Goldberg的“搜索,优化和机器学习中的遗传算法”)是衡量染色体的随机元素将被翻译成其他东西的相似度(你的“选项1”)。
即。如果你的染色体被编码为长度为1000且pmutation
为1%(0.01
)的二进制字符串,则意味着1000个(平均)中的10个将被翻转。
尽管可以避免很多随机数生成决定何时应该发生下一个突变(而不是每次都调用RNG),但实现起来有点复杂。为了避免复杂的细节,许多实现都使用“选项2”。
考虑一下,如果L
是二进制染色体的长度:
1/L
通常被认为是一种很好的突变率(例如H. Muehlenbein的“遗传算法如何真正起作用:突变和爬山”)。1/L
是标准,而您的“选项2”会出现一些问题。“选项1”更灵活,跟随rule of least surprise,所以缺少其他细节,我会选择它。