在我看来,您的术语和概念有点混乱。让我澄清一下。
首先 - 人们称呼群体成员的方式有很多种:基因型、基因组、染色体、个体、解决方案...我现在将按原样使用 解决方案,在我的意见,最笼统的说法,它是我们最终进化的东西,而且我不是生物学家,所以我不知道基因型、基因组和染色体是否有某种不同,如果它们有什么不同......
人口
遗传算法是基于种群的进化算法。这些算法(通常)具有它正在解决的问题的固定大小的解决方案群体。
遗传算子
有两个主要的遗传算子 - 交叉和变异。交叉的目标是采用两个(或在某些情况下更多)解决方案并将它们组合以创建具有两者的某些特性的解决方案,最好是两者的最佳特性。突变的目标是通过进行小的随机变化来创造新的遗传物质,该物质以前不存在于种群中。
特定运算符的选择,即是单点交叉还是多点交叉...,完全取决于问题。例如,如果您的解决方案由在每个块中协同工作的一些逻辑位块组成,则使用统一交叉可能不是一个好主意,因为它会破坏这些块。在这种情况下,单点或多点交叉是更好的选择,最好的选择可能是将交叉点限制在块的边界上。
您必须尝试最适合您的问题的方法。此外,您始终可以使用所有这些,即在每次即将执行交叉时随机选择要使用的交叉运算符。突变也是如此。
操作模式
现在回答关于所选解决方案数量的第一个问题。遗传算法可以在两种基本模式下运行 - 世代模式和稳态模式。
代际模式
在分代模式下,算法的每一代(迭代)都会替换整个种群。用于分代模式 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)
省略了解决方案的评估。
因此,所选解决方案的数量取决于您希望算法如何运行。