一、遗传算法运算流程:
(1)初始化。设置进化代数计数器g=0,设置最大进化代数G,随机生成NP个个体作为初始群体P(0)。
(2)个体评价。计算群体P( t)中各个个体的适应度。
(3)选择运算。将选择算子作用于群体,根据个体的适应度,按照一定的规则或方法,选择一些优良个体遗传到下一代群体。
(4)交叉运算。将交叉算子作用于群体,对选中的成对个体,以某一概率交换它们之间的部分染色体,产生新的个体。
(5)变异运算。将变异算子作用于群体,对选中的个体,以某一概率改变某一个或某一些基因值为其他的等位基因。群体P( t)经过选择、交叉和变异运算之后得到下一代群体P( t+1)。计算其适应度值,并根据适应度值进行排序,准备进行下一次遗传操作。
(6)终止条件判断:若g≤G,则g= g+1,转到步骤(2)﹔若g>G,则此进化过程中所得到的具有最大适应度的个体作为最优解输出,终止计算。
遗传算法运算流程图
二、MATLAB实例仿真
例2.1 用标准遗传算法求函数f ( x ) =x+10sin ( 5x )+7cos (4x)的最大值,其中x的取值范围为[0,10]。
MATLAB代码如下:
%%%%%%%%%%%%%%%标准遗传算法求函数极值%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%初始化参数%%%%%%%%%%%%%%%%%%
clear ; %清除所有变量
close all; %清图
clc; %清屏
NP = 50; %种群数量
L= 20; %二进制位串长度
Pc = 0.8; %交叉率
Pm = 0.1; %变异率
G= 100; %最大遗传代数
Xs = 10; %上限
Xx = 0; %下限
f = randi (L,NP); %随机获得初始种群
%%%%%%%%%%%%%%%%%%遗传算法循环%%%%%%%%%%%%%%%%
for k= 1:G
%%%%%%%%%%将二进制解码为定义域范围内十进制%%%%%%%%%%
for i = 1:NP
U= f(i,:);
m = 0;
for j = 1:L
m= U(j)*2^(j-1)+m;
end
x(i) = Xx+m* (Xs-Xx)/(2^L-1);
Fit(i) = func1(x(i) );
end
maxFit = max (Fit); %最大值
minFit = min (Fit); %最小值
rr = find (Fit==maxFit);
fBest = f (rr ( 1,1),:); %历代最优个体
xBest = x (rr(1,1));
Fit =(Fit-minFit)/ (maxFit-minFit); %号归一化适应度值
%%号%%%%%%%%%%%基于轮盘赌的复制操作%%%%%%%%%%%%%
sum_Fit= sum(Fit);
fitvalue= Fit./sum_Fit;
fitvalue = cumsum ( fitvalue) ;
ms = sort (rand (NP,1)) ;
fiti = 1;
newi = 1;
while newi <= NP
if(ms (newi))< fitvalue (fiti)
nf (newi, :) = f(fiti, : ) ;
newi = newi+1;
else
fiti =fiti+1;
end
end
%%%%%%%%%%%%%%%基于概率的交叉操作%%%%%%%%%%%%%
for i = 1:2:NP
p = rand;
if p< Pc
q = randi (1,L);
for j = 1:L
if q(j)==1
temp = nf(i+1,j);
nf(i+1,j) = nf(i,j);
nf(i,j) = temp;
end
end
end
end
%%%%%%%%%%%%%基于概率的变异操作%%%%%%%%%%%%%%
i = 1;
while i <= round(NP* Pm)
h = randi ([1,NP],1,1);
%随机选取一个需要变异的染色体
for j = 1 :round (L*Pm)
g = randi ([1,L],1,1);%随机选取需要变异的基因数
nf(h, g) =~ nf(h, g);
end
i= i+1;
end
f = nf;
f (1,:) = fBest;
%保留最优个体在新种群中
trace (k) = maxFit;
%历代最优适应度
end
xBest;
%最优个体
figure
plot (trace)
xlabel ( '迭代次数')
ylabel ( '目标函数值')
title ( '适应度进化曲线')
%%%%%%%%%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%%%
function result = func1(x)
fit = x+10*sin (5*x)+7*cos ( 4*x);
result = fit;
end
例2.2 计算函数的最小值,其中个体x的维数r=10。这是一个简单的平方和函数,只有一个极小点(0,0,…,0),理论最小值f (0,0,…,0)=0。
MATLAB代码如下:
%%%%%%%%%%%%%%实值遗传算法求函数极值%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%
%初始化
clear all; %清除所有变量
close all; %清图
clc; %清屏
D=10; %单染色体上的基因数(即10个变量)(每个基因采用10进制)
NP=100; %染色体数目(初始化种群的数目)
Xs=20; %变量上限
Xx=-20; %变量下限
G=1000; %最大遗传代数
f=zeros(D,NP); %初始种群赋空间 创建一个10*100的0矩阵
nf=zeros(D,NP); %子种群赋空间 创建一个10*100的0矩阵
Pc=0.8; %交叉概率
Pm=0.1; %变异概率
f=rand(D,NP)*(Xs-Xx)+Xx; %随机获得初始种群(10进制的种群),维数10*100
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%按适应度升序排列
for np=1:NP
MSLL(np)=func2(f(:,np)); %计算个染色体的适应度
end
[SortMSLL,Index]=sort(MSLL); %sort对数组元素按升序排列 SortMSLL放排序后的数 Index放排序后的位置
Sortf=f(:,Index); %将适应度按升序排列
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%遗传算法循环
for gen=1:G
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%采用君主方案进行选择交叉操作
Emper=Sortf(:,1); %君主染色体(即最好的一个)
NoPoint=round(D*Pc); %每次交叉点的个数 round取整函数
PoPoint=randi([1 D],NoPoint,NP/2); %交叉基因的位置 1-10 8*50矩阵
nf=Sortf;
%%%50个个体交叉
for i=1:NP/2
nf(:,2*i-1)=Emper; %将所有的奇数项换为君主染色体
nf(:,2*i)=Sortf(:,2*i); %偶数项不变
for k=1:NoPoint
nf(PoPoint(k,i),2*i-1)=nf(PoPoint(k,i),2*i);
nf(PoPoint(k,i),2*i)=Emper(PoPoint(k,i));
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%变异操作
for m=1:NP %对所有个体进行变异
for n=1:D %每个基因都可能变异
r=rand(1,1);
if r<Pm
nf(n,m)=rand(1,1)*(Xs-Xx)+Xx; %变异操作
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%子种群按适应度升序排列
for np=1:NP
NMSLL(np)=func2(nf(:,np));
end
[NSortMSLL,Index]=sort(NMSLL);
NSortf=nf(:,Index);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%产生新种群
f1=[Sortf,NSortf]; %子代和父代合并
MSLL1=[SortMSLL,NSortMSLL]; %子代和父代的适应度值合并
[SortMSLL1,Index]=sort(MSLL1); %适应度按升序排列
Sortf1=f1(:,Index); %按适应度排列个体
SortMSLL=SortMSLL1(1:NP); %取前NP个适应度值(这个地方有子代变为父代了)
Sortf=Sortf1(:,1:NP); %取前NP个个体
trace(gen)=SortMSLL(1); %历代最优适应度值
end
Bestf=Sortf(:,1) %最后最优个体
trace(end) %最优值 end为取最后一个值
figure
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%适应度函数
function result=func2(x)
summ=sum(x.^2);
result=summ;
end
运行结果:
Bestf =
-0.0017
0.0007
-0.0049
0.0016
0.0019
-0.0025
-0.0122
-0.0028
0.0224
-0.0082
ans =
7.6289e-04