一种新的遗传算法完整代码无需调试.docx
《一种新的遗传算法完整代码无需调试.docx》由会员分享,可在线阅读,更多相关《一种新的遗传算法完整代码无需调试.docx(16页珍藏版)》请在冰豆网上搜索。
![一种新的遗传算法完整代码无需调试.docx](https://file1.bdocx.com/fileroot1/2023-2/9/6c06647a-4ff3-4118-a392-b60eb78eceee/6c06647a-4ff3-4118-a392-b60eb78eceee1.gif)
一种新的遗传算法完整代码无需调试
一种新的遗传算法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(kk=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(kpop=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(countpop=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,:
);