matlab遗传算法 chc,matlab遗传算法

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值