遗传算法小示例

来源:互联网 发布:mac tree 编辑:程序博客网 时间:2024/06/08 01:50

求解函数Y=sin(3*x)+7*x.^(1/2)+1在(0,10)内的最大值,初始种群数为100,精确到6位小数,利用24位二进制编码方式表示个体染色体串,迭代次数为100次。

 

Initpop:

%初始化群体,规定初始种群的数量与个体长度

%popnumb表示初始种群的数目,individuallength表示个体的长度

functionpop = initpop(popnumb,individuallength)

pop= round(rand(popnumb,individuallength));

 

 

binarytodecimal:

%将种群的二进制编码与定义域内的数对应

functionpop2=binarytodecimal(pop)

[px,py]=size(pop);

fori=1:py;

    pop1(:,i)=2.^(py-i).*pop(:,i); %将矩阵中的每位二进制乘以权重

end

Dcv=sum(pop1,2);%转化为十进制数表示的一维列向量

pop2=Dcv*10/(2^py);%将十进制数转化为自变量定义域内的数

 

 

objectvalue:

function[objvalue] = objectvalue(pop)

%计算适应度函数值

m=binarytodecimal(pop);%调用binarytodecimal将种群中的个体转化为对应的自变量定义域内的数

objvalue=sin(3*m)+7*m.^(1/2)+10;%适应函数采用目标函数

 

 

selection:

function[newpop]=selection(pop,fitvalue)

%堵盘算法实现选择操作。

[px,py]=size(pop);

total_fval=sum(fitvalue);%种群的总的适应值

p_fitvalue=fitvalue/total_fval;  %个体的选择概率

p_fitvalue=cumsum(p_fitvalue);%求和排序

ms=sort(rand(px,1));       

fitin=1;

newin=1;

whilenewin<=px

    if(ms(newin))<p_fitvalue(fitin)

        newpop(newin,:)=pop(fitin,:);%pop的第fitin行赋值到newpop的mewin行

        newin=newin+1;

    else fitin=fitin+1;

    end

end

 

crossover:

function[newpop] = crossover(pop,pc)

%以交叉概率pc进行交叉

%产生新的种群

[px,py]=size(pop);

newpop=ones(size(pop));

fori=1:2:px-1;

    if(rand<pc)

        crpoint=round(rand*py);  %依据随机数选择交叉点

       newpop(i,:)=[pop(i,1:crpoint),pop(i+1,crpoint+1:py)];  %交叉

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

    else

        newpop(i,:)=pop(i,:); %不交叉

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

    end

   

end

 

 

mutation:

%以pm为变异概率,进行变异操作

function[newpop] = mutation( pop,pm )

[px,py]=size(pop);

newpop=ones(size(pop));

fori=1:px;

    if(rand<pm)

        mupoint=round(rand*py);

        if mupoint<=0

            mupoint=1;

        end

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

        if newpop(i,mupoint)==0;

            newpop(i,mupoint)=1;

        else

            newpop(i,mupoint)=0;

        end

    else

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

    end                 

end

 

 

 

 

best:

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

%返回最佳个体及其对应的适应值

[px,py]=size(pop);

bestfit=fitvalue(1);

bestindividual=pop(1,:);

fori=2:px;

    if fitvalue(i)>bestfit;

        bestfit=fitvalue(i);

        bestindividual=pop(i,:);

    end

   

end

 

 

 

functionmain()

clear

clc

popnumb=100;   

individuallength=24;%精确到6位小数

pc=0.6;              %交叉概率

pm=0.001;            %选择概率

pop=initpop(popnumb,individuallength);   %初始种群

fori=1:100;

    [objvalue]=objectvalue(pop);

    fitvalue=objvalue;                   %计算种群的适应度函数

    [newpop] = selection(pop,fitvalue);  %选择操作

    [newpop] = crossover(newpop,pc);     %交叉操作

    [newpop] = mutation(newpop,pm);      %变异操作

    pop=newpop;                          %更新种群

end

[objvalue]=objectvalue(pop);

fitvalue=objvalue; 

[bestindividual,bestfit]=best(pop,fitvalue);  %得出最佳个体串与其适应值

x2=binarytodecimal(bestindividual);            %将最佳个体串映射到自变量定义域内的具体数值

[x1]=binarytodecimal(pop);                     %将末代种群中的个体映射到定义域内的具体十进制数

[y1]=objectvalue(pop);                         %得出末代种群中个体的适应值

 

figure;

fplot('sin(3*x)+7*x.^(1/2)+10',[010]);

holdon;

plot(x1,y1,'*'); 

fprintf('thebest X is %5.3f\n',x2);

fprintf('thebest Y is %5.3f\n',bestfit);

xlabel('X');

ylabel('Y');

title('y=sin(3*x)+7*x.^(1/2)+10')

end

 

 

运行结果:


原创粉丝点击