目录
一、实验要求
二、算法详解
步骤一:定义初始各元素的初始值
种群规模:NP=?
编码长度:L=?
杂交概率:Pc=?
变异概率:Pm=?
最大迭代次数:G=?
初始种群:f = randi ([区间下限,区间上限],种群规模,编码长度)
步骤二:适应值计算
for j 1:种群规模
计算每个种群的适应度函数值
结束 for 循环
记录最大的适应度函数
记录最小的适应度函数
记录每次迭代最优个体的编码
步骤三:轮盘赌
for i 1: 最大迭代次数
随机生成NP个[0,1]的随机概率
对生成的随机数进行升序排序
定义初始值 n1=1,n2=1
while j 1:种群规模
if 随机概率(n2) < 种群选择概率(n1)
新种群的第n2行=此次选择的种群
n2 + 1
else n1+1
结束 for 循环
结束 while 循环
结束 for 循环
步骤四:杂交过程
for i 1: 最大迭代次数
for j 1:种群规模-1
随机生成一个[0,1]的概率p
if p < Pc
随机生成一组L长的编码f
for k 1:L
if 此点f中值为 1
记录此时选择过程中的新种群第i+1行,k列的值
新种群第i+1行,k列的值=新种群第i行,k列的值
新种群第i行,k列的值=上面记录的值
结束 if 语句
结束 for 循环
结束 for 循环
结束 for 循环
步骤五:变异操作
for i 1:种群规模
for j1:编码长度
随机生成一个[0,1]的随机数作为概率r
if r<Pm
新种群第i行,j列的值进行变异
结束 if 语句
结束 for 循环
结束 for 循环
步骤六:得到最优个体,最优值,最差值,平均适应值
for i 1:迭代次数
记录最优个体的编码
记录每次迭代的最优值
记录每次迭代的最差值
记录每次迭代的平均适应值
结束 for 循环
三、结果输出和分析
最优个体编码:
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
每次迭代的最优值:
18 20 20 20 21 23 23 23 23 23 23 23 23 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25
每次迭代的最差值:
8 6 8 9 9 10 9 8 10 9 9 9 9 12 11 12 11 11 12 11 9 11 12 10 10 11 11 11 13 12 11 12 10 10 12 10 8 10 12 11 11 11 9 10 10 10 11 12 9 9 12 12 12 12 7 11 11 12 11 11 11 11 12 12 11 12 10 12 11 11 11 12 11 10 11 11 13 11 10 11 13 13 12 14 14 13 11 11 11 12 12 10 12 12 11 13 10 12 9 13
每次迭代的平均适度值:
12.6800000000000 13.5900000000000 14.3500000000000 14.7300000000000 14.8900000000000 14.9300000000000 14.9100000000000 15.0200000000000 15.6600000000000 16.1200000000000 16.3700000000000 16.6600000000000 16.8600000000000 17.1300000000000 16.6700000000000 17.0600000000000 17.1500000000000 17.3600000000000 17.5200000000000 17.1200000000000 16.9400000000000 17.1100000000000 16.7900000000000 16.5600000000000 16.8700000000000 16.7100000000000 16.3300000000000 16.4300000000000 17.1000000000000 16.8900000000000 16.8200000000000 16.8500000000000 16.7100000000000 16.4400000000000 16.4200000000000 16.2200000000000 16.1100000000000 16.2400000000000 16.1500000000000 16.0300000000000 16.4900000000000 16.7000000000000 16.6000000000000 16.4200000000000 16.5800000000000 16.5500000000000 16.6900000000000 17.0800000000000 16.9200000000000 17.1400000000000 16.9000000000000 17.0400000000000 17.1500000000000 17.0100000000000 17.2300000000000 17.1900000000000 17.1500000000000 17.3600000000000 17.2100000000000 17.0200000000000 16.9000000000000 16.6500000000000 16.8100000000000 16.5900000000000 16.9100000000000 16.8600000000000 17.2800000000000 17.3900000000000 17.1000000000000 17.2700000000000 17.4500000000000 17.5800000000000 17.3800000000000 17.4100000000000 17.6200000000000 18.1900000000000 18.5600000000000 18.3100000000000 18.2700000000000 18.4400000000000 18.3800000000000 18.3800000000000 18.5000000000000 18.5200000000000 18.2900000000000 18.0200000000000 17.7200000000000 17.0700000000000 16.7100000000000 17.3600000000000 17.0500000000000 17.1500000000000 16.9600000000000 16.9800000000000 17.2400000000000 17.2800000000000 17.2100000000000 17.3900000000000 17.2400000000000 17.4700000000000
对结果进行绘图:
完整程序:
%%%%%%%%%%%%% max sum(x) %%%%%%%%%%%
close all;clear;clc;
NP = 100 ; %种群规模
L = 25 ; %编码长度
Pc = 0.7 ; %杂交概率
Pm = 0.04 ; %变异概率
G = 100; %最大迭代次数
f = randi([0,1],NP,L); %随机获得初始种群
%% 遗传算法循环
for i = 1:G
%% 适应度计算
for j = 1:NP
Fit(j) = sum(f(j,:));
end
maxFit = max(Fit); %最大值
minFit = min(Fit);%最大小值
rr = find(Fit==maxFit);
fbest = f(rr(1,1),:); %历代最优个体
%% 轮盘赌 %%%%%%%%%%
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 k = 1:NP-1
p = rand;
if p < Pc;
q = randi([0,1],1,L);
for j = 1:L
if q(j) == 1;
temp = nf(k+1,j);
nf(k+1,j) = nf(k,j);
nf(k,j) = temp;
end
end
end
end
%% 基于概率的变异操作 %%%%%%
for m = 1:NP
for n = 1:L
r = rand;
if r < Pm;
nf(m,n) = ~nf(m,n);
end
end
end
f = nf;
f(1,:) = fbest;
trace1(i) = maxFit; %最大值
trace2(i) = mean(Fit); %平均适度值
trace3(i) = minFit; %最小值
%% 动态图输出
hold on
plot(1:i,trace1(1:i),'r')
plot(1:i,trace2(1:i),'b')
plot(1:i,trace3(1:i),'g')
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);
legend('最大值','平均适应值','最小值');
drawnow;
%下面是保存为GIF的程序
frame=getframe(gcf);
imind=frame2im(frame);
[imind,cm] = rgb2ind(imind,256);
if i==1
imwrite(imind,cm,'Z1.gif','gif', 'Loopcount',inf,'DelayTime',0);
else
% 默认使用追加模型
% imwrite(imind,cm,'Z1.gif','gif','WriteMode','append','DelayTime',0);
% 如果使用上面这行代码报错,可以用下面这行代码先执行一遍,再换上面代码
imwrite(imind,cm,'Z1.gif','gif','WriteMode','overwrite','DelayTime',0);
end
end
%% 最优个体
fprintf('最优个体编码:\n')
disp(fbest)
%% 每次迭代的最优值
fprintf('每次迭代的最优值:\n')
disp(trace1)
%% 每次迭代的平均适度值
fprintf('每次迭代的平均适应值:\n')
disp(trace2)
%% 每次迭代的最差值
fprintf('每次迭代的最差值:\n')
disp(trace3)