遗传算法使用群体搜索技术,将种群代表一组问题解,通过对当前种群施加选择、交叉和变异等一系列遗传操作来产生新一代的种群,并逐步使种群进化到包含近似最优解的状态。
1. 基本概念
群体和个体:可行解集合和单个可行解
染色体和基因:可行解的编码(如‘11101101’)和单个可行解(如‘1’)
遗传编码:把优化变量(实数值或者序列顺序)转化为基因的组合表示形式,如二进制编码、十进制编码
适应度:选择适应度函数反映解的最优程度
遗传操作:1. 选择,常用“轮盘赌” ;2. 交叉,对应位互换 ;3. 变异,随机位突变
2. 改进方向
标准遗传算法存在局部搜索能力差和“早熟”等缺陷。可以从编码机制、选择策略、交叉算子、变异算子、特殊算子和参数设计(包括群体规模、交叉概率、变异概率)等方面加以改进。
3. 流程
4. 关键参数
种群规模NP:较大复杂度高,较小表现不好,一般10~200
交叉概率Pc:较大开辟新的搜索区域能力更强,但是好的个体会遭到破坏。较小则易陷入迟钝。一般选0.25~1
变异概率Pm:低频可以保护优秀个体,高频易趋于纯粹的随机。一般选0.001~0.1
遗传算法的终止进化代数G:终止条件之一,一般100~1000
5. MATLAB实例
求函数极值:
f(x)=x+10sin(5x)+7cos(4x),x∈[0,10]
f
(
x
)
=
x
+
10
s
i
n
(
5
x
)
+
7
c
o
s
(
4
x
)
,
x
∈
[
0
,
10
]
代码:
% 标准遗传算法求函数极值
%clear all;
%close all;
%clc; %清屏
NP = 50; %种群大小
L = 20; %二进制位串长度
Pc=0.8; %交叉概率
Pm = 0.1; %变异概率
G = 100; %最大遗传代数
Xr = 10; %上限
Xl = 0; %下限
f = round(rand(NP,L)); %初始种群
x = zeros(NP,1); %十进制数
Fit = zeros(NP,1); %个体适应度
nf = zeros(NP,L); %新种群
trace = zeros(G,1);
% 遗传算法循环
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) = Xl + m*(Xr-Xl)/(2^L-1);
Fit(i) = func1(x(i));
end
maxFit = max(Fit);
minFit = min(Fit);
rr = find(Fit==maxFit); %返回相等值的坐标,可能返回[2,4]。表示2,4都相等
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)); %采样NP次,从小到大排序
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 = round(rand(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(NP); %随机选择需要变异的染色体
for j = 1:round(L*Pm) %随机选择变异的基因个数
g = randi(L); %随机选择变异的基因
nf(h,g) =~ nf(h,g);
end
i = i+1;
end
f = nf;
f(1,:) = fBest; %保留最优个体在新的种群
trace(k) = maxFit; %历代最优适应度
end
figure
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
% 适应度函数
function result = func1(x)
fit = x+10*sin(5*x)+7*cos(4*x);
result = fit;
end
结果: