文章目录
过程:①编码–>初始化种群–>(计算适应度值–>②选择–>③交叉–>④变异–>新种群–>判断是否满足条件)–>解码
1. 编码
1.1 二进制编码
1.1.1 编码长度
每个自变量编码长度之和。其中自变量的编码长度为:
(a,b)代表自变量的取值范围,eps是要求的精度
%% 1.计算二进制编码的长度
for i=1:varnum
L(i) = ceil(log2(ub(i)-lb(i)/eps + 1)); %求解每个变量的长度
end
LS = sum(L); %二进制编码的总长度
%% 2.初始化种群
pop = randi([0 1],n,LS); % 种群
spoint = cumsum([0 L]); % 保存各变量对应二进制编码的位置
1.1.2 解码
将二进制数据转换为十进制
其中X为二进制转化为十进制的整数值
function real = decode(pop,lb,ub)
[row col] = size(pop);
% 1.计算X
for i=col:-1:1
temp(i) = 2^(i-1)*pop(i);
end
X = sum(temp);
% 2.二进制-->十进制转换公式
real = lb + X*(ub-lb)/(2^col-1);
end
1.2 适应度函数计算与转换
fval = Objfun(x); % 直接计算适应度值
Cmin/Cmax转换(最简单 但效果不佳)
其中Cmin.Cmax可以是特定的输入值,也可以是目标函数的最大最小值
①最大值问题
function fitvalue = fitnessfun(x)
Cmin = 0.01; % 0 or 0.1
row = size(x,1);
for i=1:row
fval = Objfun(x(i,:)); % 种群中第i个个体的函数值
if fval+Cmin > 0
fitvalue(i) = fval+Cmin;
else
fitvalue(i) = 0;
end
end
end
②最小值问题
function fitvalue = fitnessfun(x)
% 1.计算Cmax
row = size(x,1);
temp = zeros(1,row);
for i=1:row
temp(i) = Objfun(x(i,:));
end
Cmax = max(temp);
% 2.适应度转换
for i=1:row
fval = Objfun(x(i,:)); % 种群中第i个个体的函数值
if fval < Cmax
fitvalue(i) = Cmax-fval;
else
fitvalue(i) = 0;
end
end
end
线性变换1(分max min)
函数表达式:F(x) = af(x)+b
max问题: F(x) = f(x)-fmin+σ
min问题:F(x) = fmax-f(x)+σ
其中σ是一个较小的数,可使种群中最差的个体也有繁殖的机会(具体取值可以由数值量级决定)
①max问题
case '线性变化1'
kesai =0.1; //数值根据数量级决定
fmin = min(fval);
fitvalue = fval-fmin+kesai;
②min问题
case '线性变化1'
kesai = 0.1;
fmax = max(fval);
fitvalue = fmax-fval+kesai
线性变换2
函数表达式:F(x) = af(x)+b
case '线性变换2'
C =1.5; // C取值为1.2~2
fmin = min(fval);
fmax = max(fval);
favg = sum(fval)/size(x,1);
if fmin >(C*favg-fmax)/(C-1)
a =(C-1)*favg/(fmax-favg);
b =