📄 genetic.asv
字号:
function Genetic(StrAimFunc)
% This is simple genetic algorithm(SGA)
% In this function ,it fulfils genetic algorithm
%----------------These can be modified as you like-----------------------
maxgen=200; % maximum generation
sizepop=100; % size of population
AimFunc=StrAimFunc; % this is function of counting fitness
fselect='roulette'; % method of select
% you can choose 'tournament';'roulette'
fcode='grey'; % method of coding
% you can choose 'float';'grey';'binary'
pcross=[0.8]; % probablity of crossover,between 0 and 1
fcross='uniform'; % method of crossover
% you can choose 'float';'simple';'uniform'
pmutation=[0.2]; % probability of mutation,between 0 and 1
fmutation='simple'; % method of mutation
% you can choose 'float';'simple';
lenchrom=[10 10 10 10 10]; % length of bit of every varible
bound=[0 1;...
0 1;...
0 1;...
0 1;...
0 1];
%--------------------------------------------------------------------------
individuals=struct('fitness',zeros(1,sizepop),...%'value',zeros(1,sizepop),...
'chrom',[]); % structure of population
avgfitness=[]; % average fitness of population
bestfitness=[]; % best fitness of population
bestchrom=[]; % chromosome of best fitness
% inivitialization
for i=1:sizepop
% produce new population at random
individuals.chrom(i,:)=Code(lenchrom,fcode,bound);
x=Decode(lenchrom,bound,individuals.chrom(i,:),fcode);
% caculate fitness
% 修改处
%individuals.fitness(i)=AimFunc(x,heli,id_data,0);
individuals.fitness(i)=feval(AimFunc,x);
end
% find minimum value which is best
[bestfitness bestindex]=min(individuals.fitness);
bestchrom=individuals.chrom(bestindex,:);
avgfitness=sum(individuals.fitness)/sizepop;
% record average and best fitness of every generation
trace=[avgfitness bestfitness];
% evolution begin
for i=1:maxgen
% selection
individuals=Select(individuals,sizepop,fselect);
avgfitness=sum(individuals.fitness)/sizepop;
% crossover
individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,...
sizepop,fcross,[i maxgen]);
% mutation
individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,...
sizepop,fmutation,[i maxgen],bound);
% calculate fitness
for j=1:sizepop
x=Decode(lenchrom,bound,individuals.chrom(j,:),fcode);
% 修改处
%individuals.fitness(j)=AimFunc(x,heli,id_data,0);
individuals.fitness(j)=feval(AimFunc,x);
end
% substitute chromosome of worest fitness
% find minimum value which is best
[newbestfitness,newbestindex]=min(individuals.fitness);
[worestfitness,worestindex]=max(individuals.fitness);
% substitute chromosome of worest fitness
if bestfitness>newbestfitness
bestfitness=newbestfitness;
bestchrom=individuals.chrom(newbestindex,:);
end
individuals.chrom(worestindex,:)=bestchrom;
individuals.fitness(worestindex)=bestfitness;
avgfitness=sum(individuals.fitness)/sizepop;
trace=[trace;avgfitness bestfitness];
end
end
% draw fitness of every generation
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('平均适应度','最佳适应度');
disp('适应度 变量');
x=Decode(lenchrom,bound,bestchrom,fcode);
% show in command window
disp([bestfitness x]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -