我有一个关于遗传算法中变异的抽象问题。我不包括任何独立于编码环境的代码片段来询问我的问题。
我正在写一个遗传算法代码,但我不知道如何实现变异。假设将要变异的后代是一个长度为20的字符串,如10110011110101000111
。
突变必须以非常小的概率进行,例如0.001。我们产生一个介于0和1之间的随机数,并以此来决定后代是否应该突变。我的问题是,我们必须生成20个随机数,并决定每20位后代的突变?或者我们只需要为整个后代生成一个随机数,然后随机切换一点?
换句话说,子代中的每一位都有可能根据生成的随机数发生变异,还是只有一位有可能发生变异?
“传统上”突变率pmutation
(“搜索、优化和机器学习中的遗传算法”由David E Goldberg提出)是一种测量染色体随机元素将被翻转成其他东西的相似性的方法(“选项1”)。
也就是说,如果您的染色体编码为长度为1000的二进制字符串,pmutation
为1%(0.01
),这意味着您的1000位中有10位(平均)将被翻转。
虽然可以避免产生大量随机数来决定下一个突变何时发生(而不是每次调用RNG),但实现稍微复杂一些。为了避免复杂的细节,许多实现都使用“选项2”。
考虑一下,如果L
是二元染色体的长度:
1/L
通常被认为是一个好的变异率(例如H.Muehlenbein的“遗传算法的真正工作原理:变异和山岭限制”)李> 1/L
是标准,您的“选项2”可能会有一些问题李>“选项1”更灵活一点,遵循最小惊喜规则,所以如果没有其他细节,我会选择它。