⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 genetic.asv

📁 遗传算法的通用程序
💻 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 + -