手把手教你学matlab遗传算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档