遗传算法之: One Max Problem
OMP问题是一个最大化一个0
,1
比特串中1的数量的简单问题.
简单描述为:
X
→
=
{
x
1
,
x
2
,
x
3
,
.
.
.
x
N
}
\overrightarrow{X} = \{x_1, x_2, x_3, ... x_N\}
X={x1,x2,x3,...xN}, 且
x
i
∈
{
0
,
1
}
x_i \in \{0, 1\}
xi∈{0,1},目标是使下面等式最大化:
F
(
X
→
)
=
∑
i
=
1
N
x
i
F(\overrightarrow{X}) = \sum_{i=1}^{N} x_i
F(X)=i=1∑Nxi
这个例子中, N = 100 N = 100 N=100
进化策略1:
- 随机生成父比特串
- 计算适应度
- 随机突变
- 计算突变生成子串的适应度
- 比较当前子串是否是当前最优
- 是,继续在此基础上进行突变
- 否,从父串突变
- 直到 F ( X → ) F(\overrightarrow{X}) F(X) = 100结束
进化策略2:
- 随机生成父群
- 计算适应度,挑选父群中top n
- top n父群进行交叉变异
- 计算适应度,选择top n
- 循环3, 4
- 直到有子串满足结束条件 F ( X → ) = 100 F(\overrightarrow{X}) = 100 F(X)=100
进化策略3:
- 在策略2的基础上,交叉后增加,随机突变,丰富交叉样本的多样性
1. 随机突变
import random
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
def generate_sigle_parent(length, geneSet):
parentGene = np.array([np.random.choice(geneSet) for i in range(length)])
return parentGene
def get_fitness(gene):
return np.sum(gene)
def display(gene):
geneStr = ''.join(map(str, gene))
fitness = get_fitness(gene)
print('gene: %s, fitness: %d'%(geneStr, fitness))
def unisexual_mutate(parentGene, geneSet):
childGene = parentGene.copy()
index = random.randrange(0, len(parentGene))
newGene, alternate = random.sample(geneSet, 2)
if childGene[index] != newGene:
childGene[index] = newGene
else:
childGene[index] = alternate
return childGene
def evolution_v1(geneSet, target=100):
gene_list, fitness_list = [], []
bestGene = generate_sigle_parent(target,geneSet)
bestFitness = get_fitness(bestGene)
gene_list.append(bestGene)
fitness_list.append(bestFitness)
display(bestGene)
print('--------first generation---------')
if bestFitness >= target:
return bestGene
while True:
childGene = unisexual_mutate(bestGene, geneSet)
fitness = get_fitness(childGene)
gene_list.append(childGene) # collect
fitness_list.append(fitness) # collect
if fitness <= bestFitness:
continue
display(childGene)
if fitness >= target:
return childGene, gene_list, fitness_list
bestGene = childGene
bestFitness = fitness
单性遗传(随机突变)
best_gene, gene_log1, fitness_log1 = evolution_v1(geneSet=[0, 1], target=100)
gene: 1100011100001110000011011110110100001100100101100001111010011111100001101100001011000001111110000110, fitness: 49
--------first generation---------
gene: 1100011100001110000011011110110100001100100101100001111010011111100001101100001011010001111110000110, fitness: 50
gene: 1100011100001110000011011110110100001100100101101001111010011111100001101100001011010001111110000110, fitness: 51
gene: 1100011100001110000011011110110100001100100101101001111010011111110001101100001011010001111110000110, fitness: 52
gene: 1100011100001110000011011110110100001100100101101001111010011111110001101100001011010001111110100110, fitness: 53
gene: 1100011100001110000011011110110100001100100101101001111010011111110001101110001011010001111110100110, fitness: 54
gene: 1100011100001110000011011110110100001100100101101001111010011111110001101110101011010001111110100110, fitness: 55
gene: 1100011100001110010011011110110100001100100101101001111010011111110001101110101011010001111110100110, fitness: 56
gene: 1100011110001110010011011110110100001100100101101001111010011111110001101110101011010001111110100110, fitness: 57
gene: 1100011110001110110011011110110100001100100101101001111010011111110001101110101011010001111110100110, fitness: 58
gene: 1100011110001110110011011110110101001100100101101001111010011111110001101110101011010001111110100110, fitness: 59
gene: 1100011110001110110011011110110101001100100101101001111010011111110001101110101011010001111110100111, fitness: 60
gene: 1100011110011110110011011110110101001100100101101001111010011111110001101110101011010001111110100111, fitness: 61
gene: 1100011110011110110011011110111101001100100101101001111010011111110001101110101011010001111110100111, fitness: 62
gene: 1100011110011110111011011110111101001100100101101001111010011111110001101110101011010001111110100111, fitness: 63
gene: 1100011110011110111011011110111111001100100101101001111010011111110001101110101011010001111110100111, fitness: 64
gene: 1100011110011110111011011110111111001100100101101001111010011111110001111110101011010001111110100111, fitness: 65
gene: 1100011110011110111011011110111111011100100101101001111010011111110001111110101011010001111110100111, fitness: 66
gene: 1100011110011110111011111110111111011100100101101001111010011111110001111110101011010001111110100111, fitness: 67
gene: 1100011110011110111011111110111111011101100101101001111010011111110001111110101011010001111110100111, fitness: 68
gene: 1100011110011110111011111110111111011101100101111001111010011111110001111110101011010001111110100111, fitness: 69
gene: 1100011110011110111011111110111111011101110101111001111010011111110001111110101011010001111110100111, fitness: 70
gene: 1100011110011110111011111110111111011101111101111001111010011111110001111110101011010001111110100111, fitness: 71
gene: 1100011110011110111011111110111111011101111101111001111010011111110101111110101011010001111110100111, fitness: 72
gene: 1100011110011110111111111110111111011101111101111001111010011111110101111110101011010001111110100111, fitness: 73
gene: 1100011110011110111111111110111111011101111101111001111010011111110101111110101011010001111110101111, fitness: 74
gene: 1100011110011110111111111110111111011101111101111001111010011111110101111110101011010011111110101111, fitness: 75
gene: 1100011110011110111111111110111111011101111101111001111010011111110101111110101111010011111110101111, fitness: 76
gene: 1100011110011110111111111110111111111101111101111001111010011111110101111110101111010011111110101111, fitness: 77
gene: 1100011110011110111111111110111111111101111101111001111010011111111101111110101111010011111110101111, fitness: 78
gene: 1100011110011111111111111110111111111101111101111001111010011111111101111110101111010011111110101111, fitness: 79
gene: 1100011110011111111111111110111111111101111101111001111010011111111101111110101111010011111110111111, fitness: 80
gene: 1100111110011111111111111110111111111101111101111001111010011111111101111110101111010011111110111111, fitness: 81
gene: 1100111110011111111111111110111111111101111101111001111010011111111101111110101111010111111110111111, fitness: 82
gene: 1100111110011111111111111110111111111101111101111001111010011111111101111110101111110111111110111111, fitness: 83
gene: 1101111110011111111111111110111111111101111101111001111010011111111101111110101111110111111110111111, fitness: 84
gene: 1101111110011111111111111110111111111101111111111001111010011111111101111110101111110111111110111111, fitness: 85
gene: 1101111110011111111111111110111111111101111111111001111010011111111101111110111111110111111110111111, fitness: 86
gene: 1101111110011111111111111110111111111101111111111001111010011111111111111110111111110111111110111111, fitness: 87
gene: 1101111110011111111111111110111111111101111111111001111011011111111111111110111111110111111110111111, fitness: 88
gene: 1101111110011111111111111110111111111101111111111001111011111111111111111110111111110111111110111111, fitness: 89
gene: 1111111110011111111111111110111111111101111111111001111011111111111111111110111111110111111110111111, fitness: 90
gene: 1111111110011111111111111110111111111101111111111011111011111111111111111110111111110111111110111111, fitness: 91
gene: 1111111110011111111111111110111111111101111111111011111111111111111111111110111111110111111110111111, fitness: 92
gene: 1111111110011111111111111110111111111111111111111011111111111111111111111110111111110111111110111111, fitness: 93
gene: 1111111110011111111111111110111111111111111111111011111111111111111111111110111111110111111111111111, fitness: 94
gene: 1111111111011111111111111110111111111111111111111011111111111111111111111110111111110111111111111111, fitness: 95
gene: 1111111111011111111111111110111111111111111111111011111111111111111111111110111111111111111111111111, fitness: 96
gene: 1111111111011111111111111110111111111111111111111011111111111111111111111111111111111111111111111111, fitness: 97
gene: 1111111111111111111111111110111111111111111111111011111111111111111111111111111111111111111111111111, fitness: 98
gene: 1111111111111111111111111111111111111111111111111011111111111111111111111111111111111111111111111111, fitness: 99
gene: 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, fitness: 100
进化过程
2.随机交叉
def generate_parents_group(length, geneSet, group_size=10):
parentGeneGroup = [np.array([np.random.choice(geneSet) for i in range(length)]) for i in range(group_size)]
return parentGeneGroup
贪心选择
def select_topN_gene(GeneGroup, topn=5):
fitness_list =[-1*get_fitness(gene) for gene in GeneGroup]
sorted_index = np.argsort(fitness_list)
selected_Gene = [GeneGroup[i] for i in sorted_index[:topn]]
return selected_Gene
import itertools
def bisexual_mutate(GeneGroup, alpha=0.3):
childGenes = []
for couple in itertools.combinations(GeneGroup, 2):
childGene = couple[0].copy()
length = len(childGene)
random_location = random.sample(list(np.arange(length)), int(length*alpha))
childGene[random_location] = couple[1][random_location] # 交叉
childGenes.append(childGene)
return childGenes
def evolution_v2(geneSet, target=100, group_size=10, topN=5, alpha=0.5):
gene_list = []
mean_fitness = []
max_fitness = []
ParentGeneGroup = generate_parents_group(target, geneSet,group_size)
#ParentGeneGroup = bisexual_mutate(ParentGeneGroup,alpha=0.2)
selectedPGroup = select_topN_gene(ParentGeneGroup, topN)
for gene in selectedPGroup:
display(gene)
print('Selected Gene Group')
first_fitness = [get_fitness(gene) for gene in selectedPGroup]
gene_list.append(selectedPGroup)
mean_fitness.append(np.mean(first_fitness))
max_fitness.append(np.max(first_fitness))
#
for fitness in first_fitness:
if fitness >= target:
return selected_group
#while True:
for i in range(500):
# 生成下一代
childGeneGroup = bisexual_mutate(selectedPGroup,alpha=alpha)
# 筛选
selectedCGroup = select_topN_gene(childGeneGroup)
gene_list.append(selectedCGroup) # collect
# 上一代和下一代平均适应度进行比较
mean_c_fitness = np.mean([get_fitness(gene) for gene in selectedCGroup])
mean_p_fitness = np.mean([get_fitness(gene) for gene in selectedPGroup])
max_c_fitness = np.max([get_fitness(gene) for gene in selectedCGroup])
mean_fitness.append(mean_c_fitness)
max_fitness.append(max_c_fitness)
if mean_c_fitness <= mean_p_fitness:
continue
print('Selected Gene Mean Fitness :%f'%mean_c_fitness)
if max_c_fitness >= target:
return selectedCGroup, gene_list, mean_fitness
selectedPGroup = selectedCGroup
return selectedCGroup, gene_list, mean_fitness
#bestGroup, GeneGroup_list, Avg_fitness = evolution_v2(geneSet, alpha=0.1) # alpha 交叉系数
result_1 = evolution_v2(geneSet, alpha=0.1) # alpha 交叉系数
Selected Gene Group
Selected Gene Mean Fitness :57.400000
Selected Gene Mean Fitness :59.600000
Selected Gene Mean Fitness :60.800000
Selected Gene Mean Fitness :62.600000
Selected Gene Mean Fitness :64.400000
Selected Gene Mean Fitness :67.000000
Selected Gene Mean Fitness :68.000000
Selected Gene Mean Fitness :68.400000
Selected Gene Mean Fitness :69.000000
Selected Gene Mean Fitness :69.200000
Selected Gene Mean Fitness :69.800000
Selected Gene Mean Fitness :70.000000
result_2 = evolution_v2(geneSet, alpha=0.2) # alpha 交叉系数
Selected Gene Group
Selected Gene Mean Fitness :56.000000
Selected Gene Mean Fitness :59.000000
Selected Gene Mean Fitness :62.400000
Selected Gene Mean Fitness :66.400000
Selected Gene Mean Fitness :69.400000
Selected Gene Mean Fitness :70.400000
Selected Gene Mean Fitness :71.000000
Selected Gene Mean Fitness :71.200000
Selected Gene Mean Fitness :71.800000
Selected Gene Mean Fitness :72.000000
result_3 = evolution_v2(geneSet, alpha=0.3) # alpha 交叉系数
Selected Gene Group
Selected Gene Mean Fitness :58.400000
Selected Gene Mean Fitness :62.600000
Selected Gene Mean Fitness :65.200000
Selected Gene Mean Fitness :67.200000
Selected Gene Mean Fitness :70.200000
Selected Gene Mean Fitness :71.000000
Selected Gene Mean Fitness :72.600000
Selected Gene Mean Fitness :73.000000
Selected Gene Mean Fitness :73.800000
Selected Gene Mean Fitness :74.000000
result_4 = evolution_v2(geneSet, alpha=0.4) # alpha 交叉系数
Selected Gene Group
Selected Gene Mean Fitness :55.600000
Selected Gene Mean Fitness :58.000000
Selected Gene Mean Fitness :59.200000
Selected Gene Mean Fitness :61.400000
Selected Gene Mean Fitness :65.400000
Selected Gene Mean Fitness :67.400000
Selected Gene Mean Fitness :69.800000
Selected Gene Mean Fitness :70.800000
Selected Gene Mean Fitness :71.200000
Selected Gene Mean Fitness :71.600000
Selected Gene Mean Fitness :72.000000
result_5 = evolution_v2(geneSet, alpha=0.5) # alpha 交叉系数
Selected Gene Group
Selected Gene Mean Fitness :54.600000
Selected Gene Mean Fitness :55.200000
Selected Gene Mean Fitness :58.600000
Selected Gene Mean Fitness :60.200000
Selected Gene Mean Fitness :61.600000
Selected Gene Mean Fitness :64.800000
Selected Gene Mean Fitness :65.600000
Selected Gene Mean Fitness :66.600000
Selected Gene Mean Fitness :66.800000
Selected Gene Mean Fitness :67.800000
Selected Gene Mean Fitness :68.400000
Selected Gene Mean Fitness :69.000000
Selected Gene Mean Fitness :69.200000
Selected Gene Mean Fitness :70.600000
Selected Gene Mean Fitness :70.800000
Selected Gene Mean Fitness :71.000000
Selected Gene Mean Fitness :71.200000
Selected Gene Mean Fitness :71.600000
Selected Gene Mean Fitness :72.000000
result_6 = evolution_v2(geneSet, alpha=0.6) # alpha 交叉系数
Selected Gene Group
Selected Gene Mean Fitness :56.000000
Selected Gene Mean Fitness :57.800000
Selected Gene Mean Fitness :59.400000
Selected Gene Mean Fitness :60.800000
Selected Gene Mean Fitness :62.000000
Selected Gene Mean Fitness :64.800000
Selected Gene Mean Fitness :66.000000
Selected Gene Mean Fitness :67.600000
Selected Gene Mean Fitness :69.200000
Selected Gene Mean Fitness :69.600000
Selected Gene Mean Fitness :71.000000
Selected Gene Mean Fitness :72.600000
Selected Gene Mean Fitness :72.800000
Selected Gene Mean Fitness :73.400000
Selected Gene Mean Fitness :73.800000
Selected Gene Mean Fitness :74.000000
result_7 = evolution_v2(geneSet, alpha=0.7) # alpha 交叉系数
Selected Gene Group
Selected Gene Mean Fitness :55.000000
Selected Gene Mean Fitness :57.600000
Selected Gene Mean Fitness :58.600000
Selected Gene Mean Fitness :59.600000
Selected Gene Mean Fitness :61.200000
Selected Gene Mean Fitness :63.600000
Selected Gene Mean Fitness :64.800000
Selected Gene Mean Fitness :66.600000
Selected Gene Mean Fitness :67.400000
Selected Gene Mean Fitness :68.400000
Selected Gene Mean Fitness :68.600000
Selected Gene Mean Fitness :69.000000
Selected Gene Mean Fitness :70.200000
Selected Gene Mean Fitness :71.200000
Selected Gene Mean Fitness :71.600000
Selected Gene Mean Fitness :72.200000
Selected Gene Mean Fitness :72.400000
Selected Gene Mean Fitness :72.800000
Selected Gene Mean Fitness :73.000000
result_8 = evolution_v2(geneSet, alpha=0.8) # alpha 交叉系数
Selected Gene Group
Selected Gene Mean Fitness :52.400000
Selected Gene Mean Fitness :54.600000
Selected Gene Mean Fitness :55.400000
Selected Gene Mean Fitness :56.200000
Selected Gene Mean Fitness :57.200000
Selected Gene Mean Fitness :58.800000
Selected Gene Mean Fitness :59.200000
Selected Gene Mean Fitness :59.400000
Selected Gene Mean Fitness :60.200000
Selected Gene Mean Fitness :61.200000
Selected Gene Mean Fitness :61.600000
Selected Gene Mean Fitness :62.400000
Selected Gene Mean Fitness :63.200000
Selected Gene Mean Fitness :63.600000
Selected Gene Mean Fitness :64.000000
Selected Gene Mean Fitness :64.200000
Selected Gene Mean Fitness :64.400000
Selected Gene Mean Fitness :64.800000
Selected Gene Mean Fitness :65.200000
Selected Gene Mean Fitness :65.600000
Selected Gene Mean Fitness :66.000000
Selected Gene Mean Fitness :66.200000
Selected Gene Mean Fitness :66.400000
Selected Gene Mean Fitness :66.600000
Selected Gene Mean Fitness :67.000000
result_9 = evolution_v2(geneSet, alpha=0.9) # alpha 交叉系数
Selected Gene Group
Selected Gene Mean Fitness :52.200000
Selected Gene Mean Fitness :53.400000
Selected Gene Mean Fitness :54.400000
Selected Gene Mean Fitness :54.800000
Selected Gene Mean Fitness :56.200000
Selected Gene Mean Fitness :57.000000
Selected Gene Mean Fitness :57.400000
Selected Gene Mean Fitness :58.200000
Selected Gene Mean Fitness :59.000000
Selected Gene Mean Fitness :59.800000
Selected Gene Mean Fitness :60.000000
Selected Gene Mean Fitness :61.000000
Selected Gene Mean Fitness :62.400000
Selected Gene Mean Fitness :62.800000
Selected Gene Mean Fitness :63.800000
Selected Gene Mean Fitness :64.200000
Selected Gene Mean Fitness :64.400000
Selected Gene Mean Fitness :64.600000
Selected Gene Mean Fitness :64.800000
Selected Gene Mean Fitness :65.000000
Selected Gene Mean Fitness :65.200000
Selected Gene Mean Fitness :65.400000
Selected Gene Mean Fitness :65.600000
Selected Gene Mean Fitness :65.800000
Selected Gene Mean Fitness :66.400000
Selected Gene Mean Fitness :66.800000
Selected Gene Mean Fitness :67.000000
进化过程
从上图可以看出,进化过程陷入了局部最优,尽管尝试的不同的交叉比例,仍是没有改善,下面是经过选择后的TopN Gene图谱
这个图也说明,在单纯的交叉变异下,经过几轮进化后,父辈的基因基本趋于一致了,所以继续交叉下去是徒劳,很难到达最优.为了克服这个问题,继续尝试策略3,在交叉后进行突变.
3.交叉+突变
def cross_mutate(GeneGroup,alpha=0.3):
childGenes = []
for couple in itertools.combinations(GeneGroup, 2):
childGene = couple[0].copy()
length = len(childGene)
random_location = random.sample(list(np.arange(length)), int(length*alpha))
childGene[random_location] = couple[1][random_location] # 交叉
childGene = unisexual_mutate(childGene, [0, 1])
childGenes.append(childGene)
return childGenes
def evolution_v3(geneSet, target=100, group_size=10, topN=5, alpha=0.5):
gene_list = []
mean_fitness = []
max_fitness = []
ParentGeneGroup = generate_parents_group(target, geneSet,group_size)
#ParentGeneGroup = bisexual_mutate(ParentGeneGroup,alpha=0.2)
selectedPGroup = select_topN_gene(ParentGeneGroup, topN)
for gene in selectedPGroup:
display(gene)
print('Selected Gene Group')
first_fitness = [get_fitness(gene) for gene in selectedPGroup]
gene_list.append(selectedPGroup)
mean_fitness.append(np.mean(first_fitness))
max_fitness.append(np.max(first_fitness))
#
for fitness in first_fitness:
if fitness >= target:
return selected_group
#while True:
for i in range(500):
# 生成下一代
childGeneGroup = cross_mutate(selectedPGroup,alpha=alpha)
# 筛选
selectedCGroup = select_topN_gene(childGeneGroup)
gene_list.append(selectedCGroup) # collect
# 上一代和下一代平均适应度进行比较
mean_c_fitness = np.mean([get_fitness(gene) for gene in selectedCGroup])
mean_p_fitness = np.mean([get_fitness(gene) for gene in selectedPGroup])
max_c_fitness = np.max([get_fitness(gene) for gene in selectedCGroup])
mean_fitness.append(mean_c_fitness)
max_fitness.append(max_c_fitness)
if mean_c_fitness <= mean_p_fitness:
continue
print('Selected Gene Mean Fitness :%f'%mean_c_fitness)
if max_c_fitness >= target:
return selectedCGroup, gene_list, mean_fitness, max_fitness
selectedPGroup = selectedCGroup
return selectedCGroup, gene_list, mean_fitness, max_fitness
bestGeneGroup, gene_list, mean_fitness, max_fitness = evolution_v3(geneSet=[0, 1], alpha=0.3)
gene: 1011111010100111000010110011011110100100010101011011110110111001101001101111101101000101010110111101, fitness: 59
gene: 0111111001011001101110101101101100011000111011011011010000000011101010111101110000001111111111011001, fitness: 58
gene: 0110010010000101110000110101011000001111110011101111110010011101111110101111100110010010010101000110, fitness: 54
gene: 0110010100000110110111011001111010011100111010110101001110000110111110111101101010011101000000010001, fitness: 53
gene: 0101011111000011000101011111010011111110101001111010000001000000001001101111111010000100111110101011, fitness: 53
Selected Gene Group
Selected Gene Mean Fitness :58.800000
Selected Gene Mean Fitness :62.200000
Selected Gene Mean Fitness :67.200000
Selected Gene Mean Fitness :69.600000
Selected Gene Mean Fitness :70.400000
Selected Gene Mean Fitness :73.200000
Selected Gene Mean Fitness :74.400000
Selected Gene Mean Fitness :76.000000
Selected Gene Mean Fitness :78.200000
Selected Gene Mean Fitness :80.600000
Selected Gene Mean Fitness :81.800000
Selected Gene Mean Fitness :82.600000
Selected Gene Mean Fitness :82.800000
Selected Gene Mean Fitness :84.000000
Selected Gene Mean Fitness :84.200000
Selected Gene Mean Fitness :85.000000
Selected Gene Mean Fitness :85.800000
Selected Gene Mean Fitness :87.200000
Selected Gene Mean Fitness :87.800000
Selected Gene Mean Fitness :88.200000
Selected Gene Mean Fitness :88.800000
Selected Gene Mean Fitness :90.200000
Selected Gene Mean Fitness :90.800000
Selected Gene Mean Fitness :91.000000
Selected Gene Mean Fitness :91.800000
Selected Gene Mean Fitness :92.200000
Selected Gene Mean Fitness :92.400000
Selected Gene Mean Fitness :92.600000
Selected Gene Mean Fitness :93.400000
Selected Gene Mean Fitness :93.800000
Selected Gene Mean Fitness :94.200000
Selected Gene Mean Fitness :94.600000
Selected Gene Mean Fitness :94.800000
Selected Gene Mean Fitness :95.200000
Selected Gene Mean Fitness :95.600000
Selected Gene Mean Fitness :96.000000
Selected Gene Mean Fitness :96.200000
Selected Gene Mean Fitness :96.400000
Selected Gene Mean Fitness :97.200000
Selected Gene Mean Fitness :97.400000
Selected Gene Mean Fitness :97.600000
Selected Gene Mean Fitness :97.800000
Selected Gene Mean Fitness :98.200000
Selected Gene Mean Fitness :98.400000
Selected Gene Mean Fitness :98.800000
进化过程
很明显,增加随机突变后,只需要更少的进化就达到了target.
对比
单个Gene的随机突变虽然也能到达目标,但是需要很长时间的进化,在之前的"Hello World"中,也是基于个体突变,但是这个不是完整遗传算法,算是精简版,策略3也不是完全的遗传算法,在选择过程中没有基于概率选择,而是采取了贪心的策略,每次都选择绝对的topN,交叉过程中也没有严格遵循遗传算法,而是选择了随机交叉.不过这些细节都不重要.重要的是,单纯的交叉可能会陷入局部最优,单纯突变可能要很多代的进化才行,交叉+突变可以缩短进化的时间.