遗传算法求解one_max问题

遗传算法求解one_max问题

one_max问题:
所谓的one_max就是指定任意长度的二进制串,当二进制串中的所有二进制数字都为1时,one_max就得解。用数学方法表示如下:(假设二进制串的长度为L)

也即最大化函数f(x)。

遗传算法:
遗传算法是模拟自然界生物的交配,基因的重组以及变异还有自然选择来进行求解最优化问题的一种算法。其间有大体包括genetic algorithm,evolution strategy,evolution programming 和 genetic programming。四种方法在基因重组和变异上各有其不同,从而可以用来解决不同的问题。笔者刚接触遗传算法,其差别也不是了解特别清楚。在one_max问题中,我们使用GA(genetic algorithm)。
GA是遗传算法的一个分支,其在variable operator上更侧重于recombination(重组)而不是mutation(变异)。在one_max问题中,由于我们使用的是二进制串,因而我们在recombination的时候采用0ne-point crossover的方法,也即在选定的双亲中在相同的点切一刀,交换切点之后的串从而得到它们的后代。

步骤:
参数的设定:
population size = 100;
string size = 25,也即L=25;
crossover probability = 0.7
iteration  number = 100(设定一个最大的generation数,避免程序在找不到最优解的时候一直跑)
1:利用随机种子产生随机数
2:采用转轮盘的方法挑选出双亲
3:每两个相邻的双亲进行recombination
4:得到的后代进行遍历变异
5:将变异后的后代作为下一代的population
6:重复步骤2—到步骤5,一直到找到最优解或者迭代完成。

在上述步骤中,有几点是要注意的:
1):在这里我们采用generational model,即下一代的数量个当代的数量是相同的,然后整个下一代替换上一代。
2):转轮盘方法
在这里的转轮盘方法其实是基于population中每个个体的fitness来进行的。我们把某一代的population中的所有个体进行fitness函数的计算,在这里就是上面进行优化的函数,然后得到每个个体的fitness值,再基于这些值求出每个个体被选为下一代双亲的几率。得到这些几率之后就可以通过转轮盘的方法选出双亲。
我们在这里给出转轮盘方法的伪代码
假定(a1,a2,a3,...,al)是基于当代population得到的累积概率,即

令λ= μ=population,(λ是子代数量,μ是当代数量)。
BEGIN
Set current_number = 1;
WHILE(current_number<=μ) DO
Pick a random value γ uniformly from [0,1];
Set i=1;
WHILE(a_i< γ) DO
Set i = i+1;
OD
Set mating_pool[current_number] = parents[i];
Set current_number = current_number+1;
OD
END

3):recombination
在双亲选取出来后,我们对相邻的两个双亲进行重组。我们之前设置一个crossover的作用就是在于,我们在进行重组的时候随机产生一个在0-1之间的浮点数,如果其小于我们的预设值0.7,那么就继续产生一个0-string size的整数值,将这个整数值所谓crossover的断点;如果几率大于我们的预设值,那么这两个双亲就不进行重组,直接作为下一代。
4):变异
由于我们用的是GA,变异的几率比较小,通常我们在这里设置为string size的倒数。

你可能感兴趣的:(初学者,笔记)