clc
clear
% 参数定义
maxgen=4000; % 进化代数,即迭代次数
sizepop=100; % 种群规模
fselect='roulette'; % 染色体的选择方法,您可以选择:锦标赛法- 'tournament';轮盘赌法-'roulette'
fcode='float'; % 编码方法,您可以选择:浮点法-'float';grey法则--'grey';二进制法-'binary'
pcross=[0.7]; % 交叉概率选择,0和1之间
fcross='float'; % 交叉方法选择,您可以选择: 浮点交叉-'float';单点交叉-'simple';均匀交叉-'uniform'
pmutation=[0.05]; % 变异概率选择,0和1之间
fmutation='float'; % 变异方法选择,您可以选择:浮点法-'float';单点法-'simple';
N=10; %维数
lenchrom=rep([1],[1,N]); % 每个变量的字串长度,如果是浮点变量,则长度都为1
%lenchorm=300;
bound=rep([-600,600],[N,1]); % 变量取值范围
BEST=[]; %存放最优解
XX=[]; %记录多次实验最优解对应的x值
FN=[]; %记录每次实验的计算次数
% 目标函数(本算法以目标函数值为适应度)
%x=1:1:N;
%AimFunc(x);
for M=1:1:100
% 随机产生一个种群
nn=0;
x=[];
for i=1:sizepop
individuals.chrom(i,:)=Code(lenchrom,fcode,bound); % 编码(binary和grey的编码结果为一个实数,float的编码结果为一个实数向量)
x=Decode(lenchrom,bound,individuals.chrom(i,:),fcode); % 解码(binary和grey的解码结果为一个二进制串,float的解码结果为一个实数向量)
% 计算适应度
% 修改处
% individuals.fitness(i)=AimFunc(x,heli,id_data,0);
individuals.fitness(i)=AimFunc11(x); % 染色体的适应度
nn=nn+1;
% FN=[FN;nn]; %将所有的函数值放在一个矩阵中
end
% 找最好的染色体
[bestfitness, bestindex]=min(individuals.fitness);
bestchrom=individuals.chrom(bestindex,:); % 最好的染色体
avgfitness=sum(individuals.fitness)/sizepop; % 染色体的平均适应度
% 记录每一代进化中最好的适应度和平均适应度
trace=[avgfitness bestfitness];
% 设置模拟退火算法参数
T=100; % 初始温度
a=0.98; % 温度降低参数
kkk=1; % 记录模拟退火次数
% 进化开始
for i=1:maxgen
% 选择
individuals=Select(individuals,sizepop,fselect);
avgfitness=sum(individuals.fitness)/sizepop;
% 交叉
[ret1,ret2]=Cross(pcross,lenchrom,individuals.chrom,sizepop,fcross,[i maxgen],fcode,bound,individuals.fitness,bestfitness,avgfitness,nn);
individuals.chrom=ret1;
nn=ret2;
% 变异
[ret1,ret2]=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,fmutation,[i maxgen],fcode,bound,individuals.fitness,bestfitness,avgfitness,nn);
individuals.chrom=ret1;
nn=ret2;
% 计算适应度
for j=1:sizepop
x=Decode(lenchrom,bound,individuals.chrom(j,:),fcode); %解码
% 修改处
individuals.fitness(j)=AimFunc11(x);
nn=nn+1;
end
% 找到最小和最大适应度的染色体及它们在种群中的位置
[newbestfitness,newbestindex]=min(individuals.fitness);
[worestfitness,worestindex]=max(individuals.fitness);
% 代替上一次进化中最好的染色体
if bestfitness>newbestfitness
bestfitness=newbestfitness;
bestchrom=individuals.chrom(newbestindex,:);
else
bh=bestfitness-newbestfitness;
cc(kkk)=bh/T;
aa(kkk)=exp(bh/T);
if exp(1000*bh/T)>rand
kkk=kkk+1;
bestfitness=newbestfitness;
bestchrom=individuals.chrom(newbestindex,:);
end
end
T=T*a; %温度降低
individuals.chrom(worestindex,:)=bestchrom;
individuals.fitness(worestindex)=bestfitness;
avgfitness=sum(individuals.fitness)/sizepop;
% 记录每一代进化中最好的适应度和平均适应度
trace=[trace;avgfitness bestfitness];
x=Decode(lenchrom,bound,bestchrom,fcode);
end
BEST=[BEST;bestfitness];
FN=[FN;nn];
XX=[XX;x];
end
% 画出适应度曲线
hfig=findobj('Tag','trace');
% See if it is open
if ishandle(hfig)
figure(hfig);
else
hfig=figure('Tag','trace');
end
figure(hfig);
[r c]=size(trace);
plot([1:r]',trace(:,1),'r-',[1:r]',trace(:,2),'b--');
title(['适应度曲线 ' '终止代数=' num2str(maxgen)]);
xlabel('进化代数');ylabel('适应度');
legend('平均适应度','最佳适应度');
% axis([1 r 0 1])
%disp('适应度 变量');
%x=Decode(lenchrom,bound,bestchrom,fcode);
% 窗口显示
%disp([bestfitness x]);
disp('最优解集合');
BEST
disp('实验次数集合');
FN
disp('最优解对应的x的矩阵');
XX
Final=[BEST FN XX];
%disp('组合')
%Final
xlswrite('fitness11(10维)',Final);
评论2
最新资源