遗传算法(Genetic algorithm)是一种随即自适应全局搜索算法,遗传算法吸收了生命科学与工程科学的理论成果,用于解决复杂优化问题。
在遗传算法中,每个问题的解被称为染色体,染色体的具体形式是一种使用特定编码方式生成的编码串,编码串中的每一个编码单元称为基因。遗传算法通过比较染色体的适应值来区分优劣,适应值越大的染色体越优秀。
评估函数用来计算染色体的适应值。
选择算子按照一定的规则对群体的染色体进行选择,得到父代种群。一般的,越优秀的染色体被选中的次数越多。
交配算子作用于每两个成功交配的染色体,染色体交换各自部分基因,产生两个子代染色体。子代染色体取代父代染色体进入新种群,没有交配的染色体直接进入新种群。
变异算子使新种群进行小概率变异。染色体发生变异的基因改变数值,得到新的染色体。经过变异的新种群进入下一次进化。
遗传算法的基本要素:
群体:问题搜索空间的一组有效解
种群:经过选择产生的新群体
染色体:问题有效解的编码串
基因:染色体的一个编码单元
适应能力:染色体的适应值
交配:两个染色体交换部分基因得到新的染色体
变异:染色体某些基因的数值发生改变
进化结束:算法满足终止条件时结束,输出全局最优解
遗传算法的实现主要包含以下七个问题:
1、染色体编码问题----怎样对问题的解进行编码
2、群体的初始化
3、适应值的评价----评估函数一般为待优化函数,但是结束条件若无明确约束则为迭代次数
4、选择种群----根据适应值来进行种群的选择,要考虑选择压力的问题,避免快速收敛,再多变量多目标问题选择压力的影响中尤为明显
5、种群交配
6、种群变异
7、算法流程
这几个问题中尤其是选择算子、交配算子、变异算子的具体实现与算法全局搜索最优解密切相关。在处理不同问题时,对上述三个算子有不同的策略。
染色体编码:目前有格雷码编码、字母编码、多参数交叉编码。两种常用的编码是二进制编码和浮点数编码。
二进制编码需要知道问题的解空间的最大值Umax和最小值Umin,采用L位二进制编码的精度为(Umax-Umin)/(2^L-1),L为编码长度,要采用较高精度时需要增加编码长度,但由此也带来计算量的增大。
浮点数编码,染色体长度等于问题定义解的变量个数,染色体的每一位基因等于解的每一维变量。
群体初始化:一般群体初始化采用取随机值进行初始化。
选择算子:种群选择操作一般有轮盘赌选择方法和锦标赛选择方法。轮盘赌能够大概率的选中适应值优的染色体,锦标赛则是保留最优方法,二选一。
交配算子:每个染色体能否交配由交配概率决定,Pc一般取值0.4~0.99之间。随机选择交配位置。
变异算子:变异也由变异概率决定,采用生成随机数来判断,随机选择变异位置。
matlab的具体实现:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Name: genetic algorithm
% Author: yang fang jian 17888841302
% Time: 2018 09 15
% Version: beta
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;
close all;
clc;
% initial index
CrossRate = 0.88;
Mutation = 0.05;
nm = 20;
count = 0;
popsize = 20;
% initial population
max_generation = 10000;
x = rand(popsize,7);
pro_x =x;
while count < max_generation
count = count+1;
g = 200*((x(:,3)-0.5).^2+ (x(:,4)-0.5).^2 + (x(:,5)-sin(0.5.*x(:,1).*pi).*sin(0.5.*x(:,2).*pi)).^2 + (x(:,6)-0.5).^2 + (x(:,7)-0.5).^2);
f = (cos(0.5.*x(:,1).*pi).*cos(0.5.*x(:,2).*pi)).^4.*(1+g);
% evaluate
best = min(f);
seq = find(f==min(f));
x_best = x(seq(1),:);
% computing accumulate probability
Sum_f = sum(f);
for i=1:1:popsize
p(i)=1-(f(i)/Sum_f);
end
%selection
for j =1:1:popsize
r = rand();
m = 0;
for i = 1:1:popsize
m = m + p(i);
if m > r
selection(j) = i;
break;
end
end
end
%Crossover
for i = 1:1:popsize
cross = rand();
if cross > 1-CrossRate
m(i) = 1;
else
m(i) = 0;
end
end
temp = find(m==1);
max_cross = max(temp);
if mod(max_cross,2) == 1
max_cross = max_cross-1;
end
for i = 1:1:max_cross
if m(i) == 1
position(i)=floor(rand()*6);
for j = i:1:popsize
if m(j) == 1
new_x(i,:)=x(i,:);
for k =7-position(i):1:7
x(i,k)=x(j,k);
x(j,k)=new_x(i,k);
end
i = j;
break;
end
end
end
end
%mutation
for i = 1:1:popsize
cross = rand();
if cross < CrossRate
u = rand();
pos=floor(rand()*6)+1;
delta1 = (x(i,pos)-min(x(i,:)))/(max(x(i,:))-min(x(i,:)));
delta2 = (pro_x(i,pos)-x(i,pos))/(max(x(i,:))-min(x(i,:)));
if u < 0.5
delta = (2*u+(1-u)*(1-delta1).^nm).^(1/(1+nm))-1;
else
delta = 1-(2*(1-u)+2*(u-0.5)*(1-delta2).^(nm+1)).^(1/(1+nm));
end
x(i,pos)=x(i,pos)+delta*(max(x(i,:))-min(x(i,:)));
end
pro_x = x;
end
plot(count,best,'r*')
hold on;
grid on;
end