我对遗传算法有几个一般性的问题。在从群体中挑选染色体的选择步骤中,是否有理想数量的染色体被采集?如果我选择10个染色体而不是20个染色体,会有什么不同?它对最终结果有影响吗?在变异阶段,我已经了解到有不同的变异方式 - 单点交叉,两点交叉,均匀交叉和算术交叉。我什么时候应该选择其中一个?我知道它们听起来非常基本,但我无法在任何地方找到答案。所以我想我应该在Stackoverflow中问一下。 感谢
答案 0 :(得分:2)
在我看来,你的术语和概念有点搞砸了。让我澄清一下。
首先 - 人们呼叫群体成员的方式有很多种:基因型,基因组,染色体,个体,解决方案......我现在将使用解决方案,就像我一样意见,最通用的术语,它是我们最终进化的,而且我也不是生物学家所以我不知道基因型,基因组和染色体是否有所不同,以及它们是否有所不同。 ..
遗传算法是基于人口的进化算法。算法(通常)具有固定大小的解决方案,解决了它正在解决的问题。
有两个主要的遗传算子 - 交叉和变异。交叉的目标是采用两个(或者更多在某些情况下)解决方案并组合它们来创建一个具有两者的一些属性的解决方案,最佳的两者都是最好的。突变的目标是通过做一个小的随机变化来创建以前没有出现在人群中的新遗传物质。
特定运算符的选择,即单点或多点交叉......是否完全依赖于问题。例如,如果您的解决方案由在每个块中一起工作的一些逻辑位块组成,那么使用统一交叉可能不是一个好主意,因为它会破坏这些块。在这种情况下,单点或多点交叉是更好的选择,最好的选择可能是将交叉点限制在块的边界上。
您必须尝试最适合您问题的方法。此外,您始终可以使用所有这些,即通过随机选择每次即将执行交叉时将使用哪个交叉运算符。同样的变异。
现在回答您关于所选解决方案数量的第一个问题。遗传算法可以在两种基本模式下运行 - 世代模式和稳态模式。
在世代模式中,整个群体在算法的每一代(迭代)中被替换。用于代际模式GA的简单的类似python的伪代码可能如下所示:
P = [...] # initial population
while not stopping_condition():
Pc = [] # empty population of children
while len(Pc) < len(P):
a = select(P) # select a solution from P using some selection strategy
b = select(P)
if rand() < crossover_probability:
a, b = crossover(a, b)
if rand() < mutation_probability:
a - mutation(a)
if rand() < mutation_probability:
b = mutation(b)
Pc.append(a)
Pc.append(b)
P = Pc # replace the population with the population of children
省略了对解决方案的评估。
在稳态模式下,群体仍然存在,并且在每次迭代中仅替换少量解决方案。同样,简单的稳态GA可能如下所示:
P = [...] # initial population
while not stopping_condition():
a = select(P) # select a solution from P using some selection strategy
b = select(P)
if rand() < crossover_probability:
a, b = crossover(a, b)
if rand() < mutation_probability:
a - mutation(a)
if rand() < mutation_probability:
b = mutation(b)
replace(P, a) # put a child back into P based on some replacement strategy
replace(P, b)
省略了对解决方案的评估。
因此,所选解决方案的数量取决于您希望算法如何运作。