Matlab实现遗传算法的示例详解

目录
  • 1算法讲解
    • 1.1何为遗传算法
    • 1.2遗传算法流程描述
    • 1.3关于为什么要用二进制码表示个体信息
    • 1.4目标函数值与适应值区别
    • 1.5关于如何将二进制码转化为变量数值
    • 1.6关于代码改进
  • 2MATLAB自带ga函数
    • 2.1问题描述
    • 2.2自带函数使用
  • 3自编遗传算法各部分代码及使用
    • 3.1代码使用
    • 3.2Genetic1--主函数
    • 3.3PI(PopulationInitialize)--产生初始种群
    • 3.4Fitness--计算目标函数值
    • 3.5FitnessF--计算适应值
    • 3.6Translate--将二进制码转换
    • 3.7Probability--染色体入选概率
    • 3.8Select--个体选择
    • 3.9Crossing--交叉互换
    • 3.10Mutation--基因突变
    • 3.11Elitist--最优个体记录与最劣个体淘汰
    • 3.12完整代码

这篇文章用了大量篇幅讲解了如何从零开始自己写一个遗传算法函数,主要是为了应对学生作业等情况,或者让大家对遗传算法有更充分的理解,如果要用于学术研究,最好还是使用自带遗传算法,之后可能会推出更多自带遗传算法工具箱的使用。

1 算法讲解

1.1 何为遗传算法

遗传、突变、自然选择、杂交,遗传算法是一种借鉴了进化生物学各类现象的进化算法。

看到一个很形象的比喻来描述各类进化算法的区别:

  • 爬山算法:一只袋鼠朝着比现在高的地方跳去。它找到了不远处的最高的山峰。但是这座山不一定是最高峰。这就是爬山算法,它不能保证局部最优值就是全局最优值。
  • 模拟退火:袋鼠喝醉了。它随机地跳了很长时间。这期间,它可能走向高处,也可能踏入平地。但是,它渐渐清醒了并朝最高峰跳去。这就是模拟退火算法。
  • 遗传算法:有很多袋鼠,它们降落到喜玛拉雅山脉的任意地方。这些袋鼠并不知道它们的任务是寻找珠穆朗玛峰。但每过几年,就在一些海拔高度较低的地方射杀一些袋鼠。于是,不断有袋鼠死于海拔较低的地方,而越是在海拔高的袋鼠越是能活得更久,也越有机会生儿育女。就这样经过许多年,这些袋鼠们竟然都不自觉地聚拢到了一个个的山峰上,可是在所有的袋鼠中,只有聚拢到珠穆朗玛峰的袋鼠被带回了美丽的澳洲。

1.2 遗传算法流程描述

我们先随机生成几个个体(数值)。

计算这几个个体是否适合当前环境(带入某个评价函数后结果大不大)

记录一下最好的一个个体(记录一下局部最优解)。

依据适应度选入、淘汰一些个体(结果越好的数值有越大的概率不被扔掉,但是怕局部最优解所以还有有一定概率要被扔)。

交叉互换的方式进行变异(转换为十进制语言来说,例如我有两个数值13和15都还可以,新的两个数值我要在11-17区间内选俩)。

基因突变的方式进行变异(在范围内变异固然好,但是怕陷入局部最优解我还是要偶尔搞点大变异,哪怕是坏的变异) 。

进入下一轮循环,重新计算对当前环境适应程度继续前面的一系列步骤。

好多好多代后(迭代次数大于我们的设定)后,输出记录的每一轮最优解里面最好的一个。

1.3 关于为什么要用二进制码表示个体信息

这部分其实是借鉴了等位基因的概念,我们认为不同二进制码相同位置的数值为等位基因。两个二进制码链条相同位置交换我们可以看作交叉互换。

同时用二进制码还有可控变异的特点:假如我们有个二进制序列1111,转换为十进制就是15

若是我们将其变为1110,十进制变为14

若是我们将其变为1101,十进制变为13

变为1011,十进制变为11

变为0111,十进制变为7

也就是说,我们可以在大部分位置数据信息不变的情况下,各种幅度的改变我们的二进制序列代表的十进制信息。

1.4 目标函数值与适应值区别

适应值=目标函数值-f(x)下限 为了方便求概率才多了个这么个操作, 举几个例子:

  • 假设f(x)范围是[0,3] 那么三个个体函数值为[1,2,3],那么每个个体被取到的概率很自然我们就想到设置为[1,2,3]/(1+2+3)=[1/6,1/3,1/2],数值越大取到概率越大很正常。
  • 假设f(x)范围为[10,10.1] 三个个体函数值为[10.01,10.05,10.03],算出其概率为[0.3327,0.3340,0.3333]非常的接近,这是因为0.几的数对比与10太小了,因而减去10非常有必要。
  • 假设f(x)范围为[-1,1] 万一有个体数值为负数总不能搞个负数概率叭,所以-(-1)也是很有必要的。

综上我们看出Fmin的设置也需要有一定讲究,不能使适应值出现负数,也最好能使数据具有区分度,当然如果有更加合适的映射来代替线性映射也是极好(例如机器学习就常用sigmod函数来映射)。

1.5 关于如何将二进制码转化为变量数值

假设我们有一个长度为4的二进制码,则其取值范围为0000至1111即[0,15];同时我们知道最优解范围是[2,3],我们只需要将二进制码转化为十进制,并且映射到最优解取值范围就好啦, 例如1011转换为十进制为11,从区间[0,15]映射到[2,3]即为, (11-0)/(15-0)*(3-2)+2=2.7333, 从这个转换方式我们可以看出:

二进制码越长,其可取值也就越多也就能把最优解区间划分的越细,也就能使结果越精确,(当然我们可以依据我们想要的精确度大体设置二进制码长度)

最优解区间范围一定要有!!而且一个好的最优解区间能够让我们在取较短的二进制码时依旧可以得到较为精确的结果。

1.6 关于代码改进

虽然肯定比不上MATLAB自带的函数,但是对于各种自行构造的遗传算法代码,很多很多老版代码各种循环,这里能用向量运算就用向量运算,增加量程序的整洁度和速度。

2 MATLAB自带ga函数

2.1 问题描述

这里先讲解一个简单的问题,之后可能会讲解遗传算法更详细应用。

2.2 自带函数使用

这里ga求的是最小值,因此我们取个相反数。

tic
f=@(x)-(x+10*sin(5*x)+7*cos(4*x));
x=ga(f,1,[],[],[],[],0,9)
-f(x)
toc

x = 7.8568

ans = 24.8554

历时 0.072996 秒。

3 自编遗传算法各部分代码及使用

3.1代码使用

使用代码:

tic
[Count,Result,BestMember]=Genetic1(24,6,@(x)x+10*sin(5*x)+7*cos(4*x),0,9,15,0.9,200)
toc

参数:

  • 24,二进制码长度为24
  • 6,个体数目为6
  • @(x)x+10sin(5x)+7cos(4x),评价函数
  • 0,x取值下限
  • 9,x取值上限
  • 15,f(x)下限,低于这个的我们认为这个个体完全不适合在该环境下生存
  • 0.9,突变概率为了防止陷入局部最优这里数值设的其实有点大,大家用的时候设置小点就好
  • 200,迭代代数

关于各个参数更详细的说明往后看。

计算结果:

Count =200

Result =

7.8401,7.8048,7.8443,7.8403,7.8574,8.9649

24.8050,24.3683 ,24.8271,24.8066,11.1532,14.5649

BestMember =

7.8574

24.8553

历时 0.117459 秒。

即时取最大值,和自带函数算的也差不多。虽然结果不如自带函数稳定。画个图看看:

注:遗传算法毕竟是智能算法,算出的值并不一定是最优解,因而可以调整迭代次数的大小,变异概率,二进制串长度,个体数量等一系列数据来调整,正因为各个变量比较难以说明为何这样设置,所以各种建模比赛还是尽量少用这样的智能算法。

3.2 Genetic1--主函数

function [Count,Result,BestMember]=Genetic1(MumberLength,MemberNumber,FunctionFitness,MinX,MaxX,Fmin,MutationProbability,Gen)
% 参数解释: 
% 参数名                参数类型          参数含义
% =========================================================================
% MumberLength       |  数值  | 表示一个染色体位串的二进制长度
% MemberNumber       |  数值  | 表示群体中染色体个数
% FunctionFitness    |  字符串| 表示目标函数
% MinX               |  数值  | 变量区间的下限
% MaxX               |  数值  | 变量区间的上限
% Fmin               |  数值  | 适应函数过程中给出目标函数可能最小值
% MutationProbability|  数值  | 变异概率
% Gen                |  数值  |  遗传代数
% -------------------------------------------------------------------------
% Count              |  数值  | 遗传代数
% Result             |  数值  | 计算结果
% BestMember         |  数值  |  最优个体及其适应值

global Count;Count=1;% 在之后的版本中可能会不支持函数输出作为全局变量(建议在改进工作中修改)
global CurrentBest;  % 声明全局变量Count(代数)和CurrentBest(当前代数下的最优染色体)

% 随机地产生一个初始群体。
Population=PopulationInitialize(MumberLength,MemberNumber); 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(MumberLength+1);

while Count<Gen
    % 通过入选概率将入选概率大的个体选入种群,淘汰概率小的个体形成新群体
    NewPopulation=Select(Population,PopulationProbability,MemberNumber);
    Population=NewPopulation;
    
    % 通过交叉互换形成新群体;
    NewPopulation=Crossing(Population);
    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代中最优个体所对应的目标函数值;
    % MaxFitness,前Count代中最优个体所对应的目标函数值;
    EachMaxFitness(Count)=EachGenMaxFitness;
    MaxFitness(Count)=CurrentBest(MumberLength+1);
    Population=NewPopulation;    
end

% 数据整理
Dim=size(Population);
Result=ones(2,Dim(1));
for ii=1:Dim(1)
    Result(1,ii)=Translate(Population(ii,:),MinX,MaxX,MumberLength);
end
Result(2,:)=Fitness(Population,FunctionFitness,MinX,MaxX,MumberLength);
BestMember(1,1)=Translate(CurrentBest(1:MumberLength),MinX,MaxX,MumberLength);
BestMember(2,1)=CurrentBest(MumberLength+1);

% 绘图
close all
subplot(2,1,1)
plot(EachMaxFitness);
subplot(2,1,2)
plot(MaxFitness);

end

3.3 PI(PopulationInitialize)--产生初始种群

功能: 随机地产生一个初始群体。

输入变量:

  • MemberNumber代表染色体个数;
  • MumberLength代表每个染色体上含有MumberLength个基因(即编码长度);

输出变量: Poplation表示第一代群体。

原理: 生成MemberNumber个长度为MumberLength的0-1向量。

function Population=PopulationInitialize(MumberLength,MemberNumber)
Temporary=rand(MemberNumber,MumberLength);
Population=Temporary>=0.5;
% Population是一个逻辑矩阵(0-1矩阵,这么写为了方便),
% 在此函数中表示第一代群体,Population的每一行表示一个染色体
end

3.4 Fitness--计算目标函数值

功能: 计算群体中每一个染色体的目标函数值。

输入参数:

  • PopulationCode表示用二进制代码表示的群体;
  • FunctionFitness表示目标函数;
  • MinX,MaxX分别表示变量区间的下限和上限;
  • MumberLength代表一个染色体位串的二进制长度;

输出变量:PopulationFitness表示每一染色体对应的目标函数值

原理:这部分就是把各个二进制码转换为十进制数(区间范围内),然后再带入到目标函数中算出数值。

说明: 由于懒,这里把网上大部分代码中的Translate函数和Transfer函数也合了进去,没必要为了两行运算多开俩函数吧。。。

function PopulationFitness=Fitness(PopulationCode,FunctionFitness,MinX,MaxX,MumberLength)
Dim=size(PopulationCode);
PopulationFitness=zeros(1,Dim(1));
for i=1:Dim(1)
 % 转换为10进制
    PopulationData=sum(PopulationCode(i,:).*(2.^(MumberLength-1:-1:0)));
    % 映射到x取值范围
    PopulationData=MinX+PopulationData*(MaxX-MinX)/(2^Dim(2)-1);
    % 计算对应f(x)数值
    PopulationFitness(i)=FunctionFitness(PopulationData);
end
end

3.5 FitnessF--计算适应值

功能: 计算每个染色体的适应函数值。

输入参数:PopulationFitness表示目标函数值;Fmin表示目标函数的可能的最小值;

输出参数: PopulationFitnessF表示每一染色体的适应函数值。

function PopulationFitnessF=FitnessF(PopulationFitness,Fmin)
% 若某一染色体的目标函数值大于Fmin,则置其适应函数值为其目标函数值-Fmin
% 若某一染色体的目标函数值小于Fmin,则置其适应函数值为0
PopulationFitnessF=PopulationFitness-Fmin;
PopulationFitnessF(PopulationFitnessF<0)=0;
end

3.6 Translate--将二进制码转换

这部分代码已经包含在Fitness函数内了,再写一遍是专门用来服务于最后的结果输出的。

function PopulationData=Translate(PopulationCode,MinX,MaxX,MumberLength)
    Dim=size(PopulationCode);
    PopulationData=sum(PopulationCode.*(2.^(MumberLength-1:-1:0)));
    PopulationData=MinX+PopulationData*(MaxX-MinX)/(2^Dim(2)-1);
end

3.7 Probability--染色体入选概率

就是将适应值转换为概率,其方法就是除以所有适应值的和。

function PopulationProbability=Probability(PopulationFitnessF)
    PopulationProbability=PopulationFitnessF./sum(PopulationFitnessF);
end

3.8 Select--个体选择

根据入选概率在群体中按比例选择部分染色体组成种群。

function NewPopulation=Select(Population,PopulationProbability,MemberNumber)       
    % 概率密度转换为概率分布
    CProbability=PopulationProbability(1);
    for i=2:MemberNumber
        CProbability(i)=CProbability(i-1)+PopulationProbability(i);
    end
        
    % 摇随机数并依据随机数和概率选择个体
    pmat=rand([MemberNumber,1]);
    index=sum((pmat>=CProbability),2)+1;
    NewPopulation=Population(index,:);
end

3.9 Crossing--交叉互换

群体中的交叉并产生新群体,原理描述如下:

我们每次都是两个相邻的进行交叉,这样如果个体数为奇数,则最后一个个体则一直无法参与互换,因此我们每次都将倒数第一和倒数第二个体换位置,这样倒数第一位和倒数第二位就能够轮流参与交叉互换。(当然其实直接整体全部交换顺序也可以)。

function NewPopulation=Crossing(Population)
Dim=size(Population);
if Dim(1)>=3
    Population([Dim(1),Dim(1)-1],:)=Population([Dim(1)-1,Dim(1)],:);
 % 若群体中个体数大于等于3,则将最后一个个体与倒数第二个个体基因型互换;
    % 目的是防止有个体从始至终未参与交叉。
end
for i=1:2:Dim(1)-1
    % 相邻的俩个体交叉互换
    Site=randi(Dim(2));
    Population([i,i+1],1:Site)=Population([i+1,i],1:Site);
end
NewPopulation=Population;
end

想改成全部互换则可写做:

function NewPopulation=Crossing(Population)
Dim=size(Population);
Population(1:Dim,:)=Population(randperm(Dim(1)),:);

for i=1:2:Dim(1)-1
    Site=randi(Dim(2));
    Population([i,i+1],1:Site)=Population([i+1,i],1:Site);
end
NewPopulation=Population;
end

3.10 Mutation--基因突变

为每个个体摇个随机数,如果随机数符合变异概率,就随机将该个体其中一个0变为1或将1变为0。

function NewPopulation=Mutation(Population,MutationProbability)
Dim=size(Population);
for i=1:Dim(1)
    Probability=rand(1);
    Site=randi(Dim(2));
    if Probability<MutationProbability
        Population(i,Site)=mod(Population(i,Site)+1,2);
    end
end
NewPopulation=Population;
end

3.11 Elitist--最优个体记录与最劣个体淘汰

功能: 如果当前序列中有个体优于历史最优则更新历史最优,同时将当前个体组中最差个体用历史最优代替。

输入变量:

  • Population 表示当前群体;
  • PopulationFitness 表示当前群体的目标函数值;
  • MumberLength 表示一个染色体位串的二进制长度;

输出变量:

  • NewPopulationIncludeMax 表示包含历史最优个体的新一代群体;
  • CurrentBest 所有代中最优个体(当前历史最优个体);
  • EachGenMaxFitness,这一带种群中最优个体;
function [NewPopulationIncludeMax,NewCurrentBest,EachGenMaxFitness]=...
    Elitist(Population,PopulationFitness,MumberLength)
    
% 找到当前种群最优和最差个体
[~,MinSite]=min(PopulationFitness);
[MaxFitnesstemp,MaxSite]=max(PopulationFitness);
EachGenMaxFitness=MaxFitnesstemp;

% 更新历史最优
if Count==1
    CurrentBest(1:MumberLength)=Population(MaxSite,:);
    CurrentBest(MumberLength+1)=PopulationFitness(MaxSite);
else
    if CurrentBest(MumberLength+1)<MaxFitnesstemp
        CurrentBest(1:MumberLength)=Population(MaxSite,:);
        CurrentBest(MumberLength+1)=PopulationFitness(MaxSite);
    end
 % 当前种群最差用历史最优代替
    Population(MinSite,:)=CurrentBest(1:MumberLength);
end

NewPopulationIncludeMax=Population;
NewCurrentBest=CurrentBest;
end

3.12完整代码

把所有代码合在了一起:

function [Count,Result,BestMember]=Genetic1(MumberLength,MemberNumber,FunctionFitness,MinX,MaxX,Fmin,MutationProbability,Gen)
% 参数解释: 
% 参数名                参数类型          参数含义
% =========================================================================
% MumberLength       |  数值  | 表示一个染色体位串的二进制长度
% MemberNumber       |  数值  | 表示群体中染色体个数
% FunctionFitness    |  字符串| 表示目标函数
% MinX               |  数值  | 变量区间的下限
% MaxX               |  数值  | 变量区间的上限
% Fmin               |  数值  | 适应函数过程中给出目标函数可能最小值
% MutationProbability|  数值  | 变异概率
% Gen                |  数值  |  遗传代数
% -------------------------------------------------------------------------
% Count              |  数值  | 遗传代数
% Result             |  数值  | 计算结果
% BestMember         |  数值  |  最优个体及其适应值

global Count;Count=1;% 在之后的版本中可能会不支持函数输出作为全局变量(建议在改进工作中修改)
global CurrentBest;  % 声明全局变量Count(代数)和CurrentBest(当前代数下的最优染色体)

% 随机地产生一个初始群体。
Population=PopulationInitialize(MumberLength,MemberNumber); 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(MumberLength+1);

while Count<Gen
    % 通过入选概率将入选概率大的个体选入种群,淘汰概率小的个体形成新群体
    NewPopulation=Select(Population,PopulationProbability,MemberNumber);
    Population=NewPopulation;
    
    % 通过交叉互换形成新群体;
    NewPopulation=Crossing(Population);
    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代中最优个体所对应的目标函数值;
    % MaxFitness,前Count代中最优个体所对应的目标函数值;
    EachMaxFitness(Count)=EachGenMaxFitness;
    MaxFitness(Count)=CurrentBest(MumberLength+1);
    Population=NewPopulation;    
end

% 数据整理
tDim=size(Population);
Result=ones(2,tDim(1));
for ii=1:tDim(1)
    Result(1,ii)=Translate(Population(ii,:),MinX,MaxX,MumberLength);
end
Result(2,:)=Fitness(Population,FunctionFitness,MinX,MaxX,MumberLength);
BestMember(1,1)=Translate(CurrentBest(1:MumberLength),MinX,MaxX,MumberLength);
BestMember(2,1)=CurrentBest(MumberLength+1);

% 绘图
close all
subplot(2,1,1)
plot(EachMaxFitness);
subplot(2,1,2)
plot(MaxFitness);
%子函数部分
%==========================================================================
%PopulationInitialize:用于产生一个初始群体,这个初始群体含有MemberNumber
%个染色体,每个染色体含有MumberLength个基因。
    function Population=PopulationInitialize(MumberLength,MemberNumber)
        Temporary=rand(MemberNumber,MumberLength);
        Population=Temporary>=0.5;
    end

%Fitness: 用于计算群体中每一个染色体的目标函数值
    function PopulationFitness=Fitness(PopulationCode,FunctionFitness,MinX,MaxX,MumberLength)
        Dim=size(PopulationCode);
        PopulationFitness=zeros(1,Dim(1));
        for i=1:Dim(1)
            PopulationData=sum(PopulationCode(i,:).*(2.^(MumberLength-1:-1:0)));
            PopulationData=MinX+PopulationData*(MaxX-MinX)/(2^Dim(2)-1);
            PopulationFitness(i)=FunctionFitness(PopulationData);
        end
    end

%FitnessF: 用于计算每个染色体适应值
    function PopulationFitnessF=FitnessF(PopulationFitness,Fmin)
        PopulationFitnessF=PopulationFitness-Fmin;
        PopulationFitnessF(PopulationFitnessF<0)=0;
    end
%Translate
    function PopulationData=Translate(PopulationCode,MinX,MaxX,MumberLength)
        Dim=size(PopulationCode);
        PopulationData=sum(PopulationCode.*(2.^(MumberLength-1:-1:0)));
        PopulationData=MinX+PopulationData*(MaxX-MinX)/(2^Dim(2)-1);
    end

%Probability: 用于计算每个染色体入选概率
    function PopulationProbability=Probability(PopulationFitnessF)
        PopulationProbability=PopulationFitnessF./sum(PopulationFitnessF);
    end

%Elitist: 使用最佳个体保存法,输入参数为:
%Population 群体
%PopulationFitness 目标函数值
%MutationProbability 变异概率
    function [NewPopulationIncludeMax,NewCurrentBest,EachGenMaxFitness]=...
            Elitist(Population,PopulationFitness,MumberLength)
        [~,MinSite]=min(PopulationFitness);
        [MaxFitnesstemp,MaxSite]=max(PopulationFitness);
        EachGenMaxFitness=MaxFitnesstemp;
        if Count==1
            CurrentBest(1:MumberLength)=Population(MaxSite,:);
            CurrentBest(MumberLength+1)=PopulationFitness(MaxSite);
        else
            if CurrentBest(MumberLength+1)<MaxFitnesstemp
                CurrentBest(1:MumberLength)=Population(MaxSite,:);
                CurrentBest(MumberLength+1)=PopulationFitness(MaxSite);
            end      
            Population(MinSite,:)=CurrentBest(1:MumberLength);
        end
        NewPopulationIncludeMax=Population;  
        NewCurrentBest=CurrentBest;
    end      

%Select: 根据入选概率,在群体中按比例选择部分染色体组成种群
    function NewPopulation=Select(Population,PopulationProbability,MemberNumber)       
        % 概率密度转换为概率分布
        CProbability=PopulationProbability(1);
        for i=2:MemberNumber
            CProbability(i)=CProbability(i-1)+PopulationProbability(i);
        end
        
        % 摇随机数并依据随机数和概率选择个体
        pmat=rand([MemberNumber,1]);
        index=sum((pmat>=CProbability),2)+1;
        NewPopulation=Population(index,:);
    end

%Crossing: 用于群体中的交叉并产生新群体
    function NewPopulation=Crossing(Population)
        Dim=size(Population);
        
        Population(1:Dim,:)=Population(randperm(Dim(1)),:);
%         if Dim(1)>=3
%             Population([Dim(1),Dim(1)-1],:)=Population([Dim(1)-1,Dim(1)],:);
%         end

        for i=1:2:Dim(1)-1
            Site=randi(Dim(2));
            Population([i,i+1],1:Site)=Population([i+1,i],1:Site);
        end
        NewPopulation=Population;
    end

%Mutation: 用于群体中少量个体变量并产生新的群体
    function NewPopulation=Mutation(Population,MutationProbability)
        Dim=size(Population);
        for i=1:Dim(1)
            Probability=rand(1);
            Site=randi(Dim(2));
            if Probability<MutationProbability
                Population(i,Site)=mod(Population(i,Site)+1,2);
            end
        end
        NewPopulation=Population;
    end
end

以上就是Matlab实现遗传算法的示例详解的详细内容,更多关于Matlab遗传算法的资料请关注我们其它相关文章!

(0)

相关推荐

  • matlab遗传算法求解车间调度问题分析及实现源码

    目录 一.车间调度简介 1 车间调度定义 2 传统作业车间调度 二.遗传算法简介 1 遗传算法概述 2 遗传算法的特点和应用 3 遗传算法的基本流程及实现技术 3.1 遗传算法的基本流程 3.2 遗传算法的实现技术 4 遗传算法的基本原理 4.1 模式定理 4.2 积木块假设 三.部分源代码 四.运行结果 五.matlab版本及参考文献 一.车间调度简介 1 车间调度定义 车间调度是指根据产品制造的合理需求分配加工车间顺序,从而达到合理利用产品制造资源.提高企业经济效益的目的.车间调度问题从数学

  • C++实现简单遗传算法

    本文实例讲述了C++实现简单遗传算法.分享给大家供大家参考.具体实现方法如下: //遗传算法 GA #include<iostream> #include <cstdlib> #include<bitset> using namespace std; const int L=5; //定义编码的长度 int f(int x) //定义测设函数f(x) { int result; result=x*x*x-60*x*x+900*x+100; return result;

  • 遗传算法python版

    本文实例为大家分享了python遗传算法的具体代码,供大家参考,具体内容如下 1.基本概念 遗传算法(GA)是最早由美国Holland教授提出的一种基于自然界的"适者生存,优胜劣汰"基本法则的智能搜索算法.该法则很好地诠释了生物进化的自然选择过程.遗传算法也是借鉴该基本法则,通过基于种群的思想,将问题的解通过编码的方式转化为种群中的个体,并让这些个体不断地通过选择.交叉和变异算子模拟生物的进化过程,然后利用"优胜劣汰"法则选择种群中适应性较强的个体构成子种群,然后让

  • C++实现遗传算法

    本文实例讲述了C++实现简单遗传算法.分享给大家供大家参考.具体实现方法如下: // CMVSOGA.h : main header file for the CMVSOGA.cpp //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// #if !defined(AFX_CMV

  • python 如何实现遗传算法

    1.基本概念 遗传算法(GA)是最早由美国Holland教授提出的一种基于自然界的"适者生存,优胜劣汰"基本法则的智能搜索算法.该法则很好地诠释了生物进化的自然选择过程.遗传算法也是借鉴该基本法则,通过基于种群的思想,将问题的解通过编码的方式转化为种群中的个体,并让这些个体不断地通过选择.交叉和变异算子模拟生物的进化过程,然后利用"优胜劣汰"法则选择种群中适应性较强的个体构成子种群,然后让子种群重复类似的进化过程,直到找到问题的最优解或者到达一定的进化(运算)时间.

  • Matlab实现遗传算法的示例详解

    目录 1算法讲解 1.1何为遗传算法 1.2遗传算法流程描述 1.3关于为什么要用二进制码表示个体信息 1.4目标函数值与适应值区别 1.5关于如何将二进制码转化为变量数值 1.6关于代码改进 2MATLAB自带ga函数 2.1问题描述 2.2自带函数使用 3自编遗传算法各部分代码及使用 3.1代码使用 3.2Genetic1--主函数 3.3PI(PopulationInitialize)--产生初始种群 3.4Fitness--计算目标函数值 3.5FitnessF--计算适应值 3.6Tr

  • AngularJS的Filter的示例详解

    贴上几个有关Filter使用的几个示例. 1. 首先创建一个表格 <body ng-app="app"> <div class="divAll" ng-controller="tableFilter"> <input type="text" placeholder="输入你要搜索的内容" ng-model="key"> <br><br

  • bat批处理 if 命令示例详解

    if 命令示例详解 if,正如它E文中的意思,就是"如果"的意思,用来进行条件判断.翻译过来的意思就是:如果符合某一条件,便执行后面的命令. 主要用来判断,1.两个"字符串"是否相等:2.两个数值是大于.小于.等于,然后执行相应的命令. 当然还有特殊用法,如结合errorlevel:if errorlevel 1 echo error 或者结合defined(定义的意思):if defined test (echo It is defined) else echo 

  • Docker-Compose的使用示例详解

    Docker Compose是一个用来定义和运行复杂应用的Docker工具.使用Compose,你可以在一个文件中定义一个多容器应用,然后使用一条命令来启动你的应用,完成一切准备工作. - github.com/docker/compose docker-compose是用来在Docker中定义和运行复杂应用的工具,比如在一个yum文件里定义多个容器,只用一行命令就可以让一切就绪并运行. 使用docker compose我们可以在Run的层面解决很多实际问题,如:通过创建compose(基于YU

  • jQuery.Validate表单验证插件的使用示例详解

    jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求. 请在这里查看示例 validate示例 示例包含 验证错误时,显示红色错误提示 自定义验证规则 引入中文错误提示 重置表单需要执行2句话 源码示例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <

  • JavaScript中自带的 reduce()方法使用示例详解

    1.方法说明 , Array的reduce()把一个函数作用在这个Array的[x1, x2, x3...]上,这个函数必须接收两个参数,reduce()把结果继续和序列的下一个元素做累积计算,其效果就是: [x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4) 2. 使用示例 'use strict'; function string2int(s){ if(!s){ alert('the params empty'); return; } if

  • php示例详解Constructor Prototype Pattern 原型模式

    原型模式中主要角色 抽象原型(Prototype)角色:声明一个克隆自己的接口 具体原型(Concrete Prototype)角色:实现一个克隆自己的操作 当一个类大部分都是相同的只有部分是不同的时候,如果需要大量这个类的对象,每次都重复实例化那些相同的部分是开销很大的,而如果clone之前建立对象的那些相同的部分,就可以节约开销. 针对php的一种实现方式就是__construct()和initialize函数分开分别处理这个类的初始化,construct里面放prototype也就是公共的

  • JavaScript作用域示例详解

    作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域示例详解的介绍,希望能帮助大家更好的学习JavaScript. 任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期.在JavaScript中,变量的作用域有全局作用域和局部作用域两种. 一.JavaScript中无块级作用域 在Java或C#中存在块级作用域

  • .NetCore实现上传多文件的示例详解

    本章和大家分享的是.NetCore的MVC框架上传文件的示例,主要讲的内容有:form方式提交上传,ajax上传,ajax提交+上传进度效果,Task并行处理+ajax提交+上传进度,相信当你读完文章内容后能后好的收获,如果可以不妨点个赞:由于昨天电脑没电了,快要写完的内容没有保存,今天早上提前来公司从头开始重新,断电这情况的确让人很头痛啊,不过为了社区的分享环境,这也是值得的,不多说了来进入今天的正篇环节吧: form方式上传一组图片 先来看看咋们html的代码,这里先简单说下要上传文件必须要

  • JavaScript中的ajax功能的概念和示例详解

    AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML). 个人理解:ajax就是无刷新提交,然后得到返回内容. 对应的不使用ajax时的传统网页如果需要更新内容(或用php做处理时),必须重载整个网页页面. 示例: html代码如下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>

随机推荐