一种新的遗传算法完整代码无需调试.docx

上传人:b****8 文档编号:10205243 上传时间:2023-02-09 格式:DOCX 页数:16 大小:17.63KB
下载 相关 举报
一种新的遗传算法完整代码无需调试.docx_第1页
第1页 / 共16页
一种新的遗传算法完整代码无需调试.docx_第2页
第2页 / 共16页
一种新的遗传算法完整代码无需调试.docx_第3页
第3页 / 共16页
一种新的遗传算法完整代码无需调试.docx_第4页
第4页 / 共16页
一种新的遗传算法完整代码无需调试.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

一种新的遗传算法完整代码无需调试.docx

《一种新的遗传算法完整代码无需调试.docx》由会员分享,可在线阅读,更多相关《一种新的遗传算法完整代码无需调试.docx(16页珍藏版)》请在冰豆网上搜索。

一种新的遗传算法完整代码无需调试.docx

一种新的遗传算法完整代码无需调试

一种新的遗传算法matlab完整代码带说明

function[B,len,v]=B2F(sol,bounds)

%[B,len]=B2F(x,bounds)二进制编码函数

%x编码向量如x=[689];

%bounds边界约束ru如bounds=[48;311;612;];

%B二进制编码串

%编码长度L由bounds

(2)-bounds

(1)决定

%以上为例:

%编码长度向量L=[486]编成二进制L=[111000110],则len=[243]

%计算B=x-bound

(1)=[253]编成二进制B=[100101011]

n=length(sol);

len=[];B=[];v=[];

L=bounds(:

2)-bounds(:

1);

L=de2bi(L);

fori=1:

n

len(i)=length(L(i,:

));

end

v=sol-bounds(:

1)';

fori=1:

n

B=[Bde2bi(v(i),len(i))];

end

 

function[pops]=changes(cpop,bounds,len,p)

%基因突变函数

%function[pops]=changes(pop,bounds,len,p)

%pop种群数目

%bounds边界约束

%len每个变量的编码长度

%如len为[433];表示有三个变量,第一个变量的二进制编码长度为4,依次类推

%p突变概率

%pops返回突变后的基因

%p1基因突变数目

ifisempty(p)

p=0.01;

end

[n,m]=size(cpop);

pop=cpop;

p1=round(sum(len)*n*p);

k=0;q=[];v=[];

while(k

k=k+1;

q(k)=round(rand*(sum(len)*n-1))+1;

fori=1:

k-1

ifq(k)==q(i)

q(k)=[];

k=k-1;

end

end

end

fori=1:

n

[B(i,:

),len]=B2F(pop(i,:

),bounds);

end

v=reshape(B,1,n*sum(len));

fori=1:

p1

ifv(q(i))==0

v(q(i))=1;

else

v(q(i))=0;

end

end

v=reshape(v,n,sum(len));

fori=1:

n

pop(i,:

)=F2B(v(i,:

),bounds,len);

end

pops=pop

cpop

 

function[cpop,len,v]=cross(child,bounds,CP)

%交叉函数,采取点交叉

%[newpop,len]=cross(child,bounds,CP)

%child复制后的种群

%bounds边界约束

%CP交叉概率

%newpop交叉后的新种群

%len每个变量的编码长度

%如len返回为[433];表示有三个变量,第一个变量的二进制编码长度为4,依次类推

ifisempty(CP)

CP=0.25;

end

[n,m]=size(child);

B=[];len=[];t=[];

mychild=child(:

1:

end-1);

v=[];

p=rand(1,n);

k=1;

fori=1:

n

ifp(i)

v(k)=i;

k=k+1;

end

end

if(rem(k,2)==0)

temp=v(k-1);

while(temp==v(k-1))

temp=round(rand*(n-1))+1;

end

v(k)=temp;

k=k+1;

end

ifisempty(v)

[B(i,:

),len]=B2F(mychild(1,:

),bounds);

B=[];

else

fori=1:

k-1

[B(i,:

),len]=B2F(mychild(v(i),:

),bounds);

end

fori=1:

2:

k-2

p2=round(rand*sum(len)-1)+1;

t=zeros(1,p2);

t(i,:

)=B(i,1:

p2);

B(i,1:

p2)=B(i+1,1:

p2);

B(i+1,1:

p2)=t(i,:

);

end

fori=1:

k-1

mychild(v(i),:

)=F2B(B(i,:

),bounds,len);

end

end

cpop=mychild;

 

functionb=de2bi(d,n,p)

%functionb=de2bi(d,n,p)

%DE2BI转换10进制数为二进制数。

%B=DE2BI(D)转换正整数向量D成二进制矩阵B。

%二进制矩阵B的每一行表示十进制向量D中相应的数。

%B=DE2BI(D,N)转换正整数向量D成二进制矩阵B,

%但指定B的列数为N。

%B=DE2BI(D,N,P)转换正整数向量D成p进制矩阵B。

%p进制矩阵B的每一行表示十进制向量D中相应的数。

d=d(:

);len_d=length(d);

ifmin(d)<0,error('Cannotconvertanegativenumber');

elseif~isempty(find(d==inf)),

error('InputmustnotbeInf.');

elseiffind(d~=floor(d)),

error('Inputmustbeaninteger.');

end;

ifnargin<2,

tmp=max(d);b1=[];

whiletmp>0

b1=[b1rem(tmp,2)];tmp=floor(tmp/2);

end;

n=length(b1);

end;

ifnargin<3,p=2;end;

b=zeros(len_d,n);

fori=1:

len_d

j=1;tmp=d(i);

while(j<=n)&(tmp>0)

b(i,j)=rem(tmp,p);tmp=floor(tmp/p);

j=j+1;

end;end;

 

function[pops,len]=F2B(x,bounds,len)

%二进制编码转化为十进制

%[pops]=F2B(x,bounds,len)

%x二进制串如x=[011001010101]

%len二进制串的分段len=[345]

%bounds边界约束

%pops十进制

n=length(x);

m=length(len);

q=[];

fori=1:

m

q(i)=sum(len(1:

i));

end

q=[0q];

forj=1:

m

pops(j)=bounds(j,1);

p=[];

p=x(q(j)+1:

q(j+1));

L1=q(j+1)-q(j);

fork=1:

L1

pops(j)=pops(j)+p(k)*2^(k-1);

end

end

 

function[sol,eval]=f553(sol,options)

m

(1)=sol

(1);

m

(2)=sol

(2);

m(3)=sol(3);

%失效概率矩阵

q=[0.010.050.100.18;

0.080.020.150.12;

0.040.050.200.10];

%约束条件

g1=51-(m

(1)+3).^2+m

(2).^2+m(3).^2;

g2=20*sum(m+exp(-m))-120;

g3=20*sum(m.*exp(-m/4))-65;

%计算加惩罚项的适值

if((g1>=0)&(g2>=0)&(g3>=0))

multi=1;

fori=1:

3

summ=0;

forj=2:

4

summ=summ+q(i,j).^(m(i)+1);

end

multi=multi*(1-(1-(1-q(i,1)).^(m(i)+1))-summ);

end

eval=multi;

else

%取M=500

eval=-500;

end

 

function[f,x]=myga(num,bounds,Myfun,N,CP,P)

%[f,x]=ga(num,bounds,fun,N,CP,P)

%该遗传算法适用于:

%目标函数为求最大值,且解非负整数解

%bounds边界约束

%Myfun为目标函数

%num初始种群数

%N最大迭代次数

%CP交叉概率

%P突变概率

%f目标最优解

%x最优解向量

m=nargin;

ifm<6

disp('-_-错误!

')

disp('>>输入变量太少')

disp('>>按回车键查看帮助')

pause

helpga

f='-_-';

x='没有规矩不成方圆';

break;

end

pop=INTinti(num,bounds);

fmax=pop(:

end);

endpop=pop;

n=size(endpop,2);

k=0;x=[];f=zeros(1,num);

while(k

pop=mutation(endpop);

[cpop,len,v]=cross(pop,bounds,CP);

[pops]=changes(cpop,bounds,len,P);break;

fori=1:

num

sol=pops(i,:

);

[f(i)]=Myfun(sol);

iffmax(i)

fmax(i)=f(i);

endpop(i,1:

end-1)=pops(i,:

);

end

end

endpop(:

end)=fmax(:

);

k=k+1;

end

[f,ii]=max(fmax);

x=endpop(ii,1:

end-1);

 

function[sol,eval]=gaDemo1Eeval(sol,options)

x=sol

(1);

eval=x+10*sin(5*x)+7*cos(4*x);

%参数说明

%eval:

个体的适应度;

%sol:

当前个体,n+1个元素的行向量。

 

function[pop]=INTinti(num,bounds)

%[pop]=INTinti(num,bounds)

%inti编码函数

%num种群数

%bounds边界约束

n=size(bounds,1);

L=bounds(:

2)-bounds(:

1);

p=rand(num,n);

fori=1:

num

p(i,:

)=round(p(i,:

).*L');

pop(i,:

)=p(i,:

)+bounds(:

1)';

f(i)=myfun(pop(i,:

));

end

pop=[popf'];

 

function[child]=mutation(pop)

%复制函数,采取小盘轮转法

%[child]=mutation(pop)

%mutation编码

%pop初始种群

%child返回复制后的种群

%pop(:

end)适值度

[n,m]=size(pop);

f=pop(:

end);

value=sum(f);

fori=1:

n

p(i)=f(i)/value;

q(i)=sum(p(1:

i));

end

t=rand(1,n);

forj=1:

n

fork=1:

n

ift(j)

v(j)=k;

break

end

end

end

i=1:

n;

child(i,:

)=pop(v(i),:

);

 

function[f]=myfun(sol,bnd)

x=sol;

n=length(x);

f=0;

fori=1:

n

f=f+x(i)*i;

end

 

function[f,x]=myga(num,bounds,N,CP,P)

%[f,x]=ga(num,bounds,fun,N,CP,P)

%[f,x]=myga([],bounds,[],[],[])

%该遗传算法适用于:

%目标函数为求最大值,且解非负整数解

%bounds边界约束

%Myfun为目标函数

%num初始种群数

%N最大迭代次数

%CP交叉概率

%P突变概率

%f目标最优解

%x最优解向量

m=nargin;

ifm<5

disp('-_-错误!

')

disp('>>输入变量太少')

disp('>>按回车键查看帮助')

pause

helpga

f='-_-';

x='没有规矩不成方圆';

break;

end

ifisempty(CP)

CP=0.25;

end

ifisempty(P)

P=0.01;

end

ifisempty(N)

N=1000;

end

ifany(bounds(:

1))<0

disp('-_-错误!

')

disp('>>按回车键查看帮助')

pause

helpga

f='-_-';

x='没有规矩不成方圆';

break;

end

ifisempty(num)

num=100;

end

pop=INTinti(num,bounds);

fmax=pop(:

end);

endpop=pop;

n=size(endpop,2);

count=0;x=[];f=zeros(1,num);

while(count

pop=mutation(endpop);

[cpop,len,v]=cross(pop,bounds,CP);

[pops]=changes(cpop,bounds,len,P);

fori=1:

num

sol=pops(i,:

);

[f(i)]=Myfun(sol);

%惩罚策略

forjj=1:

length(sol)

ifsol(jj)

f(i)=-inf;

end

ifsol(jj)>bounds(jj,2)

f(i)=-inf;

end

end

iffmax(i)

fmax(i)=f(i);

endpop(i,1:

end-1)=pops(i,:

);

end

end

endpop(:

end)=fmax(:

);

count=count+1;

%[f,ii]=max(fmax);

%x=endpop(ii,1:

end-1);

end

[f,ii]=max(fmax);

x=endpop(ii,1:

end-1);

 

function[newpop,len]=xcross(child,bounds,CP)

mychild=child(:

1:

end-1);

[B(1,:

),len]=B2F(mychild(1,:

),bounds);

newpop=B(1,:

);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1