🌞欢迎来到智能优化算法的世界
🌈博客主页:卿云阁💌欢迎关注🎉点赞👍收藏⭐️留言📝
🌟本文由卿云阁原创!
🌠本阶段属于筑基阶段之一,希望各位仙友顺利完成突破
📆首发时间:🌹2021年9月22日🌹
✉️希望可以和大家一起完成进阶之路!
🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!
🍓训练部分
二、代码如下(示例):
1.f = randi([0,1],NP,L) % 随机获得初始种群
50(NP)行20(L)列,每一行代表一个个体,每个个体有20个基因。
2.编码
%% 将二进制解码为定义域范围内十进制%%
for i = 1:NP //从第1个个体到第50个个体
U = f(i,:); //第i行全部元素,代表一个个体
m = 0;
for j=1:L
m = U(j)*2^(j-1)+m; //二进制解码为定义域范围内十进制m,m代表一个个体
end
x(i)=Xx+m*(Xs-Xx)/(2^L-1); //编码精度,第i个个体的x的值
Fit(i) = func1(x(i)); //计算每i个体对应的适应度的值
end
maxFit = max(Fit); %最大值
minFit = min(Fit); %最小值
rr = find(Fit==maxFit);
fBest = f(rr(1,1),:); % 历代最优个体fBest(1*20)代表最优个体
xBest = x(rr(1,1)); %最优个体对应x的值
Fit = (Fit-minFit)/(maxFit-minFit); % 归一化适应度(把适应度变成0~1之间的数)
Fit代表50个个体的适应度
rr = find(Fit==maxFit);rr表示第几个个体是最优个体
3.%% 基于轮盘赌的复制操作%%
%% 基于轮盘赌的复制操作%%
sum_Fit = sum(Fit); //50个个体归一化适应度的和
fitvalue = Fit./sum_Fit; //(1*50)代表50个个体被选择的概率
fitvalue = cumsum(fitvalue) % 累计 //(1*50)计算累加概率
ms = sort(rand(NP,1)); % 排序 //产生(50*1)0~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
//nf(n*20)n是被选择的个体
4. %% 基于概率的交叉操作%%
%% 基于概率的交叉操作%%
for i=1:2:NP
p=rand; //产生0~1之间的随机数p
if p<Pc
q=randi([0,1],1,L); //产生(1*20)0~1之间的随机数
for j=1:L
if q(j)==1;
temp=nf(i+1,j);
nf(i+1,j)=nf(i,j);
nf(i,j)=temp; //相邻两个个体第j个基因的交换
end
end
end
end
5.%% 基于概率的变异操作%%
%% 基于概率的变异操作%%
i=1;
while i<=round(NP*Pm) //取整50*0.1
h=randi([1,NP],1,1); //生成1x1的伪随机整数矩阵,范围为1~NP,选取个体
for j=1:round(L*Pm) //取整20*0.1
g=randi([1,L],1,1); //生成1x1的伪随机整数矩阵,范围为1~NP,选取基因
nf(h,g)=~ nf(h,g); //0~1,1~0
end
i=i+1;
end
f=nf;
f(1,:)=fBest; %保留最优个体在新种群中(第一行)
trace(k)=maxFit; %历代最优适应度
end
%%%%%f(x)=x+10sin(5x)+7cos(4x)%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
%% 绘制函数图像%%
x=0:0.01:10
y=x+10*sin(5*x)+7*cos(4*x);
plot(x,y)
xlabel('x')
ylabel('f(x)')
title('f(x)=x+10sin(5x)+7cos(4x)')
%% 初始化参数%%
NP = 50; % 种群数量
L = 20; % 二进制位串长度
Pc = 0.8; % 交叉率
Pm = 0.1; % 变异率
G = 100; % 最大遗传代数
Xs = 10; % 上限
Xx = 0; % 下限
f = randi([0,1],NP,L) % 随机获得初始种群
%% 遗传算法循环%%
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([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