📄 sga.m
字号:
% 双峰和多峰函数最大值的遗传算法求解
% 利用基本遗传算法的思路寻找双峰或多峰函数的最大值,选择采用轮盘选择方法;交叉采用单点交叉,交叉位置随机,交叉概率取0.20;变异概率0.005。经
% 多次运行,求得最大值。停止法则为循环最大遗传代数为止到。
% X.*sin(10*pi*X)+2.0这样的多峰函数的最大值采用遗传算法似乎是最好的算法。
function SGA()
%简单遗传算法程序解决多峰函数的最值问题
Maxgen=200; %最大遗传代数
NIND=50; %个体数目
gen_len=30; %基因长度
FieldD=[-1,2];%区域描述
cross_probability=0.20;%交叉概率
mutate_probability=0.005;%变异概率
fun='variable.*sin(10*pi*variable)+2.0';%目标函数
%subplot(2,1,1);
fplot(fun,FieldD);%画出目标函数曲线
hold on
%生成初始种群
Chrom=round(rand(NIND,gen_len)); %生成二维01数组
Chrom_real=bs2rv(Chrom,FieldD) %二进制转换成十进制数
%计算目标函数值
Obj=Chrom_real.*sin(10*pi*Chrom_real)+2.0
%绘制初始值点
plot(Chrom_real,Obj,'*');
%绘制当前最大值的点
ma(1,3)=1;
[ma(1,2) index]=max(Obj);
ma(1,3)=Chrom_real(index);
plot(ma(1,3),ma(1,2),'>');
%种群平均值
ma(1,4)=mean(Obj);
%开始遗传计算
for gen=1:Maxgen
%计算适应度
sumObj=sum(Obj);%所有个体的目标函数值之和
fitness=Obj/sumObj;%每个个体的选择概率
fitness2=fitness(1);%累计概率
%选择
numof=length(fitness);
%计算累计概率fitness2
for j=2:numof
fitness2(j)=fitness(j)+fitness2(j-1);%计算累计概率
end
%轮盘选择
tempChrom=Chrom;%储存一个原始的个体值
index=1;
for k=1:NIND
for j=1:numof
if rand<fitness2(j)
Chrom(index)=tempChrom(j);
index=index+1;
break;
end
end
end
%交叉运算 单点交叉
n1=0;
for i=1:NIND
if rand(1)>cross_probability
if n1==0
n1=1;
temindex=i;%纪录第一个交叉个体
continue;
else %选够两个个体则交叉
pos=round(rand*gen_len)+1;
tempC=Chrom(temindex,:);
Chrom(temindex,pos:gen_len)=Chrom(i,pos:gen_len);
Chrom(i,pos:gen_len)=tempC(pos:gen_len);
n1=0;
end
end
end
%变异运算
for i=1:NIND
for j=1:gen_len
if rand<mutate_probability
Chrom(i,j)=abs(Chrom(i,j)-1);
end
end
end
Chrom_real=bs2rv(Chrom,FieldD); %二进制转换成十进制数
%计算目标函数值
Obj=Chrom_real.*sin(10*pi*Chrom_real)+2.0;
%绘制当前最大值的点
ma(gen+1,1)=gen+1;
[ma(gen+1,2) index]=max(Obj);
ma(gen+1,3)=Chrom_real(index);
plot(ma(gen+1,3),ma(gen+1,2),'>r');
%各代种群平均值
ma(gen+1,4)=mean(Obj);
%subplot(2,1,2);
%plot(1:gen+1,ma(gen+1,1));
end
%输出计算结果
ma
[best_Y index]=max(ma(:,2))
X=ma(index,3)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -