在遗传算法中,将 n n n 维决策向量 X = [ x 1 , x 2 , … , x n ] T X=[x_1,x_2,…,x_n]^T X=[x1,x2,…,xn]T 用 n n n 个记号 X i ( i = 1 , 2 , … , n ) X_i(i=1,2,…, n) Xi(i=1,2,…,n)所组成的符号串 X X X 来表示:
把每一个 X i X_i Xi 看作一个遗传基因,它的所有可能取值就称为等位基因,这样, X X X 就可看作由 n n n 个遗传基因所组成的一个染色体。
在遗传算法中,决策向量 X X X 组成了问题的解空间。对问题最优解的搜索是通过对染色体 X X X 的搜索过程来完成的,因而所有的染色体 X X X 就组成了问题的搜索空间。
1. 遗传算法运算流程
- 初始化。设置进化代数计数器 g = 0 g=0 g=0,设置最大进化代数 G G G,随机生成 N P NP NP个个体作为初始群体 P ( 0 ) P(0) P(0)
- 个体评价。计算群体 P ( t ) P(t) P(t)中各个个体的适应度。
- 选择运算。将选择算子作用于群体,根据个体的适应度,按照一定的规则或方法,选择一些优良个体遗传到下一代群体。
- 交叉运算。将交叉算子作用于群体,对选中的成对个体,以某一概率交换它们之间的部分染色体,产生新的个体
- 变异运算。将变异算子作用于群体,对选中的个体,以某一概率改变某一个或某一些基因值为其他的等位基因。群体 P ( t ) P(t) P(t) 经过选择、交叉和变异运算之后得到下一代群体 P ( t + 1 ) P(t+1) P(t+1)。计算其适应度值,并根据适应度值进行排序,准备进行下一次遗传操作。
- 终止条件判断:若
g
≤
G
g≤G
g≤G,则
g
=
g
+
1
g=g+1
g=g+1,转到步骤(2);若
g
>
G
g>G
g>G ,则此进化过程中所得到的具有最大适应度的个体作为最优解输出,终止计算。
2. 关键参数说明
群体规模 N P NP NP
- 较大的群体规模意味着计算复杂度较高,一般 N P 取 10 ∼ 200 NP取10\sim200 NP取10∼200
交叉概率 P c P_c Pc
- 交叉概率过大,高性能的模式可能会遭到破坏;过小,遗传搜索可能会陷入迟钝状态。一般 P c 取 0.25 ∼ 1.00 P_c取0.25\sim1.00 Pc取0.25∼1.00
变异概率 P m P_m Pm
- 一般低频度的变异可防止群体中重要基因的可能丢失,高频度的变异将使遗传算法趋于纯粹的随机搜索。通常 P m 取 0.001 ∼ 0.1 P_m取0.001\sim0.1 Pm取0.001∼0.1
遗传运算中终止进化代数 G G G
- G G G 的可能取值可在 100 ∼ 1000 100\sim1000 100∼1000之间
matlab仿真代码
仿真过程如下:
-
初始化种群数目为 N P = 50 NP=50 NP=50 ,染色体二进制编码长度为 L = 20 L =20 L=20 ,最大进化代数为 G = 100 G=100 G=100 ,交叉概率为 P c = 0.8 P_c=0.8 Pc=0.8 ,变异概率为 P m = 0.1 P_m=0.1 Pm=0.1
-
产生初始种群,将二进制编码转换成十进制,计算个体适应度值,并进行归一化;采用基于轮盘赌的选择操作、基于概率的交叉和变异操作,产生新的种群,并把历代的最优个体保留在新种群中,进行下一步遗传操作。
-
判断是否满足终止条件:若满足,则结束搜索过程,输出优化值;若不满足,则继续进行迭代优化。
%%%%%%%%%%%%%%%%%%%%标准遗传算法求函数极值%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%初始化参数%%%%%%%%%%%%%%%%%%%%%%%%%%
clear;
close all;
clc;
NP = 50; %种群数量
L = 20; %二进制位串长度
Pc = 0.8; %交叉率
Pm = 0.1; %变异率
G = 100; %最大遗传代数
Xs = 10; %上限
Xx = 0; %下线
f = randi([0,1],NP,L); %生成一个50行20列的(0-1)数组
%%%%%%%%%%%%%%%%%%%%%%%%遗传算法循环%%%%%%%%%%%%%%%%%%%%%%%%
for k = 1:G
%%%%%%%%将二进制解码为定义域范围内的十进制%%%%%%%%
for i = 1:NP
U = f(i,:); %取 f矩阵的第一行
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([0 1],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
优化结束后,其适应度进化曲线如图所示。