matlab遗传算法结果与函数不同,通俗解释matlab之遗传算法程序汇总与结果显示(三)...

(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',[0 10]);

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);

%-------------函数说明----------------

%    初始化种群大小

%       输入变量:

%               popsize:种群大小

%               chromlength:染色体长度--》转化的二进制长度

%       输出变量:

%               pop:种群

%---------------------------------------

function pop = initpop(popsize,chromlength)

pop = round(rand(popsize,chromlength));

%-------------函数说明----------------

%     二进制转化十进制函数

%       输入变量:

%               二进制种群

%       输出变量:

%               十进制数值

%---------------------------------------

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;

%-------------函数说明----------------

%     计算函数目标值

%       输入变量:

%              二进制数值

%       输出变量:

%               目标函数值

%---------------------------------------

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;

%-------------函数说明----------------

%

%       输入变量:

%                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;

newin = 1;

while newin<=px

if (ms(newin))

newpop(newin,:)=pop(fitin,:);

newin=newin+1;

else fitin=fitin+1;

end

end

%-------------函数说明----------------

%

%       输入变量:

%             pop:二进制的父代种群数

%             pc:交叉的概率

%       输出变量:

%             newpop:交叉后的种群数

%---------------------------------------

function [newpop]=crossover(pop,pc)

[px,py]=size(pop);

newpop = ones(size(pop));

for i=1:2:px-1

if(rand

cpoint = round(rand*py);

newpop(i,:) = [pop(i,1:cpoint),pop(i+1,cpoint+1:py)];

newpop(i+1,:) = [pop(i+1,1:cpoint),pop(i,cpoint+1:py)];

else

newpop(i,:)=pop(i,:);

newpop(i+1,:)=pop(i+1,:);

end

end

%-------------函数说明----------------

%

%       输入变量:

%                 pop  :  二进制种群

%                 pm  :  变异概率

%       输出变量:

%                newpop  :  变异以后的种群

%---------------------------------------

function [newpop] = mutation(pop,pm)

[px,py] = size(pop);

newpop = ones(size(pop));

for i=1:px

if(rand

mpoint = round(rand*py);

if mpoint<=0

mpoint=1;

end

newpop(i,:) = pop(i,:);

if newpop(i,mpoint)==0

newpop(i,mpoint)=1;

else newpop(i,mpoint)=0;

end

else

newpop(i,:)=pop(i,:);

end

end

%-------------函数说明----------------

%

%       输入变量:

%                pop  :  种群

%                fitvalue  :  种群适应度

%

%       输出变量:

%                bestindividual  : 最佳个体(二进制个体)

%                bestfit     :   最佳适应度值

%---------------------------------------

function [bestindividual,bestfit]=best(pop,fitvalue)

[px,py]=size(pop);

bestindividual = pop(1,:);

bestfit = fitvalue(1);

for i=2:px

if fitvalue(i)>bestfit

bestindividual = pop(i,:);

bestfit = fitvalue(i);

end

end (2)实验结果

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值