遗传算法
智能优化算法
几个概念:
种群:有很多个个体组成的群体
个体(染色体):相当于待求解优化问题的一个解
基因:每个解的组成分量
几个算子:
选择:从当前的种群中选择比较好的个体,使之有机会将其基因遗传到下一代。
交叉:从选择好的个体中两两配对并按照某种方式呼唤基因以产生下一代。
变异:对种群中一些个体以一定概率变异
编码:
二进制编码
实值编码
符号编码
解码:
将二进制数据转换为十进制数据
x
=
s
+
(
b
−
a
)
∗
X
/
(
2
L
−
1
)
x=s+(b-a)*X/(2^L - 1)
x=s+(b−a)∗X/(2L−1)
选择:轮盘赌选择法
适应度函数尺度变换:
适应度函数fitness function 的选取直接影响到遗传算法的收敛速度以及能否找到最优解,因为遗传算法在进化搜索中基本不利用外部信息,仅以适应度函数为依据,利用种群中每个个体的适应度来进行搜索
最优化问题可分为两大类,一类为求目标函数的全局最大值,另一类为求目标函数的全局最小值,对于这两类优化问题,目标函数值f(x)到搜索空间中对应个体的适应度函数值F(x)的转换方法
交叉:
二进制编码,
单点
两点
变异:
规定变异概率Pm
长度为10,馋哼一个[1 10]的随机整数,若r<Pm,则0变1、1变0
编码->初始化种群->计算适应度->选择->交叉->变异->新种群->是否满足条件->解码
#Matlab
示例
目标函数变为适应度函数
objfun.m文件(目标函数)
function fvl = objfun(x)
fval = 11*sin(6*x) + 7*cos(5*x); //求最大值
fitnessfun.m文件(适应度函数)
function fitvalue = fitnessfun(x)
Cmin = 0.01;
[row, ~] = size(x);
for i = 1:row
fval = objfun(x(i,:));
if fval + Cmin > 0
fitvalue(i) = fval + Cmin;
else
fitvalue(i) = 0;
end
fitvalue(i) = 0;
end
end
decode.m函数文件(二进制转换为十进制)
function real = decode(pop,lb,ub)
//pop种群
//varnum变量个数
[~,col] = size(pop);
for j = col:-1:1
temp(j) = 2^(j-1)*pop(j);
end
temp = sum(temp);
real = lb + temp * (ub-lb)/(2^col-1);
end
selection.m选择函数
function [dad,mom] = selection(pop,fitvalue)
//计算累加概率
PP = cumsum(fitvalue ./ sum(fitvalue));
[row,~] = size(pop);
//选择出row个个体 用轮盘赌方法
for i = 1:row
for j = 1:row
r = rand;
if r <= PP(j)
dad(i,:) = pop(j,:);
break;
end
end
mom(i,:) = pop(randi([1,row]),:);
end
crossover.m交叉函数
function newpop = crossover(dad,mom,pc)
[row,col] = size(dad);
for i = 1:row
if rand < pc
cpoint = randi([1,col-1]);
newpop(i,:) = [dad(i,1:cpoint) mom(i,cpoint+1:end)];
else
newpop(i,:) = dad(i,:);
end
end
mutation.m变异函数
function newpop = mutation(pop,pm)
[row,col] = size(pop);
newpop = zeros(row,col);
for i = 1:row
mpoint = randi([1,col]);
if rand < pm
newpop(i,:) = ~pop(i,mpoint);
else
newpop(i,:) = pop(i,:);
end
end
GeneticAlgorithm.m文件
varnum 变量个数
eps 精度
lb ub 变量范围
n 种群大小
交叉概率 pc
变异概率 pm
动态先行变换 M
f = @(x) 11*sin(6*x) + 7*cos(5*x);
ezplot(f)
hold on
h = plot(0,0,'*')
//给函数画图
varnum = 1;
n = 200;
lb = -pi;
ub = pi;
eps = 1e-2;
pc = 0.9;
pm = 0.01;
maxgen = 200;
//变量初始化
//初始化种群
for i = 1:varnum
L(i) = cell(log2((ub(i)-lb(i)) / esp + 1));
end
LS = sum(L); //总长度
pop = randi([0,1],n,LS); //生成随机种群要么是0要么是1
spoint = cumsum([0,L]); //将二进制代码分割使用
for iter = 1:maxgen
//将二进制转换为十进制
for i = 1:n
for j = 1:varnum
startpoint = spoint(j)+1;
endpoint = spoint(j+1);
real(i,j) = decode(pop(i,startpoint:endpoint),lb(j),ub(j));
end
end
//计算适应度值
fitvalue = fitnessfun(real);
fval = objfun(real);
h.XData = real;
h.VData = fval;
pause(0.05)
//选择
[dad,mom] = selection(pop,fitvalue);
//交叉
newpop = crossover(dad,mom,pc);
//变异
newpop = mutation(newpop,pm);
pop = newpop;
end
for i = 1:n
for j = 1:varnum
startpoint = spoint(j)+1;
endpoint = spoint(j+1);
real(i,j) = decode(pop(i,startpoint:endpoint),lb(j),ub(j));
end
end
fitvalue = fitnessfun(real);