手把手教你学matlab遗传算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于遗传算法求解函数最优值
1.选择函数形式:y=10*sin(5*x)+7*abs(x-5)+10
2.函数直观图像:
3.函数理论最大值:
X=0.286,Y=52.8990
4.Matlab函数实现:
the best X is--->>0.32
the best Y is--->>52.73
5.Matlab程序
5.1--------------------------------------------------------------
%-------------函数说明----------------
%
%主函数
%---------------------------------------
function main()
clear
clc
popsize=100;%种群大小
chromlength=10;%二进制编码长度
pc=0.6;%交叉概率
pm=0.001;%变异概率
pop=initpop(popsize,chromlength);%初始种群
for i=1:100
[objvalue]=cal_objvalue(pop);%计算适应度值(函数值)fitvalue=objvalue;
[newpop]=selection(pop,fitvalue);%选择操作
[newpop]=crossover(newpop,pc);%交叉操作
[newpop]=mutation(newpop,pm);%变异操作
pop=newpop;%更新种群
[bestindividual,bestfit]=best(pop,fitvalue);%寻找最优解x2=binary2decimal(bestindividual);
x1=binary2decimal(newpop);
[y1]=cal_objvalue(newpop);
if mod(i,10)==0
figure;
fplot('10*sin(5*x)+7*abs(x-5)+10',[010]);
hold on;
title(['迭代次数为n='num2str(i)]);
plot(x1,y1,'*');
end
end
fprintf('the best X is--->>%5.2f\n',x2);
fprintf('the best Y is--->>%5.2f\n',bestfit);
5.2-----------------------------------
%-------------函数说明----------------
%初始化种群大小
%输入变量:
%popsize:种群大小
%chromlength:染色体长度--》转化的二进制长度
%输出变量:
%pop:种群
%---------------------------------------
function pop=initpop(popsize,chromlength)
pop=round(rand(popsize,chromlength));
5.3--------------------------------------
%-------------函数说明----------------
%二进制转化十进制函数
%输入变量:
%二进制种群
%输出变量:
%十进制数值
%---------------------------------------
function pop2=binary2decimal(pop)
[px,py]=size(pop);
for i=1:py
pop1(:,i)= 2.^(py-i).*pop(:,i);
end
%sum(.,2)对行求和,得到列的向量
temp=sum(pop1,2);
pop2=temp*10/1023;
5.4--------------------------------------
%-------------函数说明----------------
%计算函数目标值
%输入变量:
%二进制数值
%输出变量:
%目标函数值
%---------------------------------------function[objvalue]=cal_objvalue(pop)
x=binary2decimal(pop);
%转化二进制数为x变量的变化域范围的数值
%x=temp*10/1023;
%objvalue=10*sin(5*x)+7*cos(4*x);
%objvalue=10*sin(x)+7*x+10
objvalue=10*sin(5*x)+7*abs(x-5)+10;
5.5------------------------------------------%-------------函数说明----------------
%
%输入变量:
%pop:二进制种群
%fitvalue:适应度值
%输出变量:
%newpop:选择以后的二进制种群
%---------------------------------------function[newpop]=selection(pop,fitvalue) %构造轮盘
[px,py]=size(pop);
totalfit=sum(fitvalue);
p_fitvalue=fitvalue/totalfit;
p_fitvalue=cumsum(p_fitvalue);%概率求和排序%-------
ms=sort(rand(px,1));%从小到大排列
fitin=1;