模拟退火算法Matlab实现

    xiaoxiao2023-11-06  130

    模拟退火算法Matlab实现

    瞎BB代码目标函数选择两个个体交配二进制转十进制适应度函数是否交叉或变异交叉变异生成随机初等行变换的单位矩阵主函数

    瞎BB

    代码

    目标函数

    function value=targetfun(x) value=200*exp(-0.05*x).*sin(x);

    选择两个个体交配

    %select two individuals function seln=selection(population,cumsump) seln=zeros(1,2); for i=1:2 r=rand; prand=cumsump-r; j=1; %stop when cumsump>r while prand(j)<0 j=j+1; end seln(i)=j; end

    二进制转十进制

    function x=transform2to10(population) BitLength=size(population,2); x=population(BitLength); for i=1:BitLength-1 x=x+population(BitLength-i)*power(2,i); end

    适应度函数

    function [fitvalue,cumsump]=fitness(population) global BitLength global boundsbegin global boundsend popsize=size(population,1); cumsump=zeros(1,popsize); fitvalue=zeros(1,popsize); for i=1:popsize x=transform2to10(population(i,:)); %tansform to range of variable xx=boundsbegin+x.*(boundsend-boundsbegin)./(power((boundsend),BitLength)-1); fitvalue(i)=targetfun(xx); end %ensure fitvalue>0 fitvalue=fitvalue'+230; fsum=sum(fitvalue); Pperpopulation=fitvalue/fsum; cumsump(1)=Pperpopulation(1); for i=2:popsize cumsump(i)=cumsump(i-1)+Pperpopulation(i); end cumsump=cumsump';

    是否交叉或变异

    function pcc=IfCroIfMut(cro_or_mut) test(1:100)=0; l=ceil(rand()*cro_or_mut); test(1:l)=1; n=ceil(rand*100); pcc=test(n);

    交叉

    function scro=crossover(population,seln,pc) %seln:two individuals BitLength=size(population,2); pcc=IfCroIfMut(pc); if pcc==1 %generate a random position chb=round(rand*(BitLength-2))+1; %crossover scro(1,:)=[population(seln(1),1:chb) population(seln(2),chb+1:BitLength)]; scro(2,:)=[population(seln(2),1:chb) population(seln(1),chb+1:BitLength)]; else scro(1,:)=population(seln(1),:); scro(2,:)=population(seln(2),:); end

    变异

    function snnew=mutation(snew,pmutation) BitLength=size(snew,2); snnew=snew; pmm=IfCroIfMut(pmutation); if pmm==1 %generate a random position chb=round(rand*(BitLength-1))+1; %0to1 or 1to0 snnew(chb)=abs(snew(chb)-1); end

    生成随机初等行变换的单位矩阵

    function f=generate_random_eye(a) n=size(a); c1=ceil(rand*n); c2=ceil(rand*n); for i=1:20 while c1==c2 c1=ceil(rand*n); c2=ceil(rand*n); end temp=a(c1,:); a(c1,:)=a(c2,:); a(c2,:)=temp; end f=a;

    主函数

    %max goal function value clc,clear global BitLength global boundsbegin global boundsend cro_mut_rate=0.01; %range of variable bounds=[-2 2];
    转载请注明原文地址: https://yun.8miu.com/read-111115.html
    最新回复(0)