function [Count,Result,BestMember] = Genetic1(MumberLength,...
MemberNumber,FunctionFitness,MinX,MaxX,Fmin,MutationProbability,Gen)
%7遗传算法的主程序
%Input -MumberLength 表示一个染色体位串的二进制长度
% -MemberNumber 表示群体中染色体的个数。
% -FunctionFitness 表示目标函数,可以是个字符串表达式
% -MinX 变量区间的下限 -MaxX 变量区间的上限
% -Fmin 定义适应函数过程中给出的一个目标函数的可能的最小值
% -MutationProbability 表示变异的概率,一般都很小
% -Gen 表示遗传的代数,也就是终止程序的代数
%Output -Count 表示遗传的代数
% -Result表示计算结果,也就是最优解
% -BestMember表示最优个体及其适应值
Population = PopulationInitialize(MumberLength,MemberNumber);
global Count CurrentBest;
Count = 1;
PopulationCode = Population;
PopulationFitness = Fitness(PopulationCode,FunctionFitness,...
MinX,MaxX,MumberLength);
PopulationFitnessF = FitnessF(PopulationFitness,Fmin);
PopulationProbability = Probability(PopulationFitnessF);
[Population,CurrentBest,EachGenMaxFitness] = Elitist(...
PopulationCode,PopulationFitness,MumberLength);
EachMaxFitness(Count) = EachGenMaxFitness;
MaxFitness(Count) = CurrentBest(length(CurrentBest));
while Count < Gen
NewPopulation = Select(Population,PopulationProbability,MemberNumber);
Population = NewPopulation;
NewPopulation = Crossing(Population,FunctionFitness,...
MinX,MaxX,MumberLength);
Population = NewPopulation;
NewPopulation = Mutation(Population,MutationProbability);
Population = NewPopulation;
PopulationFitness = Fitness(Population,...
FunctionFitness,MinX,MaxX,MumberLength);
PopulationFitnessF = FitnessF(PopulationFitness,Fmin);
PopulationProbability = Probability(PopulationFitnessF);
Count = Count + 1;
[NewPopulation,CurrentBest,EachGenMaxFitness] = Elitist(...
Population,PopulationFitness,MumberLength);
EachMaxFitness(Count) = EachGenMaxFitness;
MaxFitness(Count) = CurrentBest(length(CurrentBest));
Population = NewPopulation;
end
Dim = size(Population);
Result = ones(2,Dim(1));
for i = 1:Dim(1)
Result(1,i) = Translate(Population(i,:),MinX,MaxX,MumberLength);
end
Result(2,:) = PopulationFitness;
BestMember(1,1) = Translate(CurrentBest(1:MumberLength),...
MinX,MaxX,MumberLength);
BestMember(2,1) = CurrentBest(MumberLength+1);
close all
subplot(211)
plot(EachMaxFitness)
subplot(212)
plot(MaxFitness)
%子程序1
function Population = PopulationInitialize(MumberLength,MumberNumber)
%用于产生一个初始群体,这个初始群体含有MumberLength个基因(二进制码)。
Temporary = rand(MumberNumber,MumberLength);
Population = (Temporary >= 0.5*ones(size(Temporary)));
%子程序2
function PopulationFitness = Fitness(PopulationCode,FunctionFitness,...
MinX,MaxX,MumberLength)
%用于计算群体中每一个染色体的目标函数值
%Input -PopulationCode 表示用0-1代码表示的群体
% -FunctionFitness 表示目标函数,可以是一个字符串表达式
% -MumberLength 表示染色体位串的二进制长度
% -[MinX,MaxX] 分别指变量区间的上下限
Dim = size(PopulationCode);
PopulationFitness = zeros(1,Dim(1));
for i = 1:Dim(1)
PopulationFitness(i) = Transfer(PopulationCode(i,:),...
FunctionFitness,MinX,MaxX,MumberLength);
end
%子程序3
function PopulationData = Translate(PopulationCode,MinX,MaxX,MumberLength)
%把变成码的群体翻译成变量的数值
%Input -PopulationCode 群体编码 -[MinX,MaxX] 变量区间的上下限
% -MumberLength 染色体位串的二进制长度
PopulationData = 0;
Dim = size(PopulationCode);
for i = 1:Dim(2)
PopulationData = PopulationData+PopulationCode(i)*(2^(MumberLength-i));
end
PopulationData = MinX+PopulationData*(MaxX-MinX)/(2^Dim(2)-1);
%子程序4
function PopulationFitness = Transfer(PopulationCode,FunctionFitness,...
MinX,MaxX,MumberLength)
%把群体中的染色体的目标函数值用数值表示出来,是Fitness的重要子程序
PopulationFitness = 0;
PopulationData = Translate(PopulationCode,MinX,MaxX,MumberLength);
PopulationFitness = double(subs(FunctionFitness,'x',sym(PopulationData)));
%子程序5
function PopulationFitnessF = FitnessF(PopulationFitness,Fmin)
%用于计算每个染色体的适应函数值
%Input -PopulationFitness 群体中染色体的目标函数值
% -Fmin 定义函数参数过程中给出的一个目标函数的可能的最小值
Dim = size(PopulationFitness);
PopulationFitnessF = zeros(1,Dim(2));
for i = 1:Dim(2)
if PopulationFitness(i) > Fmin
PopulationFitnessF(i) = PopulationFitness(i)-Fmin;
else
PopulationFitnessF(i) = 0;
end
end
%子程序6
function PopulationProbability = Probability(PopulationFitness)
%用于计算群体中每个染色体的入选概率
%Input -PopulationFitness 群体中染色体的适应函数值
SumPopulationFitness = sum(PopulationFitness);
PopulationProbability = PopulationFitness/SumPopulationFitness;
%子程序7
function NewPopulation = Select(Population,PopulationProbability,...
MemberNumber)
%根据入选概率(计算累计概率)在群体中按比例选择部分染色体组成种群
%Input -Population 群体 -PopulationProbability 入选概率
% -MemberNumber 群体中染色体的个数
%计算累计概率
CProbability(1) = PopulationProbability(1);
for i = 2:MemberNumber
CProbability(i) = CProbability(i-1)+PopulationProbability(i);
end
%按比例选择
for i = 1:MemberNumber
r = rand(1);
Index = 1;
while r > CProbability(Index)
Index = Index + 1;
end
NewPopulation(i,:) = Population(Index,:);
end
%子程序8
function NewPopulation = Crossing(Population,FunctionFitness,...
MinX,MaxX,MumberLength)
%
Dim = size(Population);
if Dim(1) >= 3
Temp = Population(Dim(1),:);
Population(Dim(1),:) = Population(Dim(1)-1,:);
Population(Dim(1)-1,:) = Temp;
end
for i = 1:2:Dim(1)-1
SiteArray = randperm(Dim(2));
Site = SiteArray(1);
Temp = Population(i,1:Site);
Population(i,1:Site) = Population(i+1,1:Site);
Population(i+1,1:Site) = Temp;
end
NewPopulation = Population;
%子程序9
function NewPopulation = Mutation(Population,MutationProbability)
%用于群体中少量个体变量并产生新的群体
%Output -Population 群体 -MutationProbability 变异概率
Dim = size(Population);
for i = 1:Dim(1)
Probability = rand(1);
Site = randperm(Dim(2));
if Probability < MutationProbability
if Population(i,Site(1)) == 1
Population(i,Site(1)) = 0;
end
if Population(i,Site(1)) == 0
Population(i,Site(1)) = 1;
end
end
end
NewPopulation = Population;
%子程序10
function [NewPopulationIncludeMax,CurrentBest,EachGenMaxFitness] = ...
Elitist(Population,PopulationFitness,MumberLength)
%用到最佳个体保存方法(“优胜劣汰”思想)
%Input -Populatiion 群体 -PopulationFitness 目标函数值
% -MumberLength 染色体个数
global Count CurrentBest
[MinFitness,MinSite] = min(PopulationFitness);
[MaxFitness,MaxSite] = max(PopulationFitness);
EachGenMaxFitness = MaxFitness;
if Count == 1
CurrentBest(1:MumberLength) = Population(MaxSite,:);
CurrentBest(MumberLength+1) = PopulationFitness(MaxSite);
else
if CurrentBest(MumberLength+1) < PopulationFitness(MaxSite);
CurrentBest(1:MumberLength) = Population(MaxSite,:);
CurrentBest(MumberLength+1) = PopulationFitness(MaxSite);
end
Population(MinSite,:) = CurrentBest(1:MumberLength);
end
NewPopulationIncludeMax = Population;