精华内容
下载资源
问答
  • 遗传算法经典实例

    千次阅读 2014-08-12 12:13:23
    下面用手工计算来简单地模拟遗传算法的各个主要执行步骤。 例:求下述二元函数的最大值:  (1) 个体编码 遗传算法的运算对象是表示个体的符号串,所以必须把变量 x1, x2 编码为一种 符号串。本题中,用无符号...

    下面用手工计算来简单地模拟遗传算法的各
    个主要执行步骤。
      
         例:求下述二元函数的最大值:

     (1) 个体编码
               遗传算法的运算对象是表示个体的符号串,所以必须把变量 x1, x2 编码为一种
           符号串。本题中,用无符号二进制整数来表示。
               因 x1, x2 为 0 ~ 7之间的整数,所以分别用3位无符号二进制整数来表示,将它
           们连接在一起所组成的6位无符号二进制数就形成了个体的基因型,表示一个可
           行解。
               例如,基因型 X=101110 所对应的表现型是:x=[ 5,6 ]。
               个体的表现型x和基因型X之间可通过编码和解码程序相互转换。

    (2) 初始群体的产生
              遗传算法是对群体进行的进化操作,需要给其淮备一些表示起始搜索点的初始
          群体数据。
             本例中,群体规模的大小取为4,即群体由4个个体组成,每个个体可通过随机
         方法产生。
              如:011101,101011,011100,111001
             
     (3) 适应度汁算
              遗传算法中以个体适应度的大小来评定各个个体的优劣程度,从而决定其遗传
           机会的大小。
              本例中,目标函数总取非负值,并且是以求函数最大值为优化目标,故可直接
           利用目标函数值作为个体的适应度。

     (4)  选择运算
              选择运算(或称为复制运算)把当前群体中适应度较高的个体按某种规则或模型遗传到下一代群体中。一般要求适应度较高的个体将有更多的机会遗传到下一代
          群体中。                   
    本例中,我们采用与适应度成正比的概率来确定各个个体复制到下一代群体中
         的数量。其具体操作过程是:
             •  先计算出群体中所有个体的适应度的总和  fi  ( i=1.2,…,M );
             •  其次计算出每个个体的相对适应度的大小 fi / fi ,它即为每个个体被遗传
                 到下一代群体中的概率,
             •  每个概率值组成一个区域,全部概率值之和为1;
             •  最后再产生一个0到1之间的随机数,依据该随机数出现在上述哪一个概率区
                 域内来确定各个个体被选中的次数。

    (5)  交叉运算
            交叉运算是遗传算法中产生新个体的主要操作过程,它以某一概率相互交换某
        两个个体之间的部分染色体。
           本例采用单点交叉的方法,其具体操作过程是:
           • 先对群体进行随机配对;
           • 其次随机设置交叉点位置;
           • 最后再相互交换配对染色体之间的部分基因。

    (6)  变异运算
             变异运算是对个体的某一个或某一些基因座上的基因值按某一较小的概率进
         行改变,它也是产生新个体的一种操作方法。
            本例中,我们采用基本位变异的方法来进行变异运算,其具体操作过程是:
            • 首先确定出各个个体的基因变异位置,下表所示为随机产生的变异点位置,
              其中的数字表示变异点设置在该基因座处;
            • 然后依照某一概率将变异点的原有基因值取反。

    对群体P(t)进行一轮选择、交叉、变异运算之后可得到新一代的群体p(t+1)。

    从上表中可以看出,群体经过一代进化之后,其适应度的最大值、平均值都得
        到了明显的改进。事实上,这里已经找到了最佳个体“111111”。       
    [注意]      
          需要说明的是,表中有些栏的数据是随机产生的。这里为了更好地说明问题,
     我们特意选择了一些较好的数值以便能够得到较好的结果,而在实际运算过程中
     有可能需要一定的循环次数才能达到这个最优结果。

     

     

    展开全文
  • 基本遗传算法实例-遗传算法实例.doc 这是关于基本遗传算法的一些小程序,希望对大家有所裨益! 遗传算法实例.doc
  • 遗传算法经典MATLAB代码,有利于初学者对MATLAB遗传算法的了解和应用
  • 非常好用的遗传算法 C#程序 源码 遗传算法例子 遗传算法程序
  • 介绍遗传算法,解码的函数,进化,评估个体适应值遗传算法
  • 遗传算法经典论文

    2019-01-15 16:48:27
    遗传算法经典论文,入门自己下载的,有需要的自行提取,强力推荐
  • 遗传算法教学算法实例
  • 遗传算法例子

    2017-12-02 20:53:35
    遗传算法 遗传算法 遗传算法 遗传算法 遗传算法 遗传算法
  • 遗传算法简明实例.ppt

    2020-08-13 10:29:46
    遗传算法简明实例.ppt,44页,遗传算法起源、思想、概念、手工模拟计算实例和TSP问题等几个简明例子,便于初学者方便理解遗传算法
  • 遗传算法入门实例

    2013-11-07 16:38:38
    遗传算法入门实例,资料包含了遗传算法在行业中的应用,尤其在人工智能游戏中的应用
  • matlab遗传算法实例

    2018-06-28 13:18:33
    matlab遗传算法实例 matlab遗传算法实例 matlab遗传算法实例
  • 遗传算法应用实例.pdf

    热门讨论 2010-04-28 12:48:40
    遗传算法 遗传算法 遗传算法 遗传算法 遗传算法 遗传算法 遗传算法 遗传算法 遗传算法 遗传算法 遗传算法 遗传算法 遗传算法 遗传算法 应用实例 哈哈哈哈哈哈哈哈
  • 该资源包含了常用的7种C#遗传算法源码实例集,和遗传算法C#五子棋游戏程序
  • 主要包含了遗传算法实例程序
  • 遗传算法应用实例

    2020-03-23 03:41:03
    遗传算法是一种很好的求解最优问题算法工具,特别是非线性问题的求解
  • 遗传算法经典案例

    2013-08-29 16:53:13
    遗传算法经典案例,简单易懂,非常好哦~~~
  • 遗传算法例子

    2013-04-26 12:46:28
    遗传算法例子
  • 经典遗传算法及MATLAB实例

    千次阅读 多人点赞 2020-10-28 12:20:23
    经典遗传算法及简单实例(MATLAB)1. 遗传算法简单介绍1.1 理论基础1.2 算法要点1.1 编码1.2 适应度函数1.3 基本流程2. 雪兔实例 1. 遗传算法简单介绍 1.1 理论基础 整个算法的基础就是达尔文的生物进化论,...

    1. 遗传算法简单介绍

    1.1 理论基础

    整个算法的基础就是达尔文的生物进化论,“物竞天择,适者生存” 这句话已经是常识了。

    用雪兔做一个引子吧:

    东北那旮瘩,有群原始雪兔,刚从未知物种进化而来,五颜六色(表现型)漂亮极了,称之为 I(0)。
    (注意:种群初始化)

    入夏了,雪兔们出来觅食,浅色兔在草地中无所遁形,被雪狐收割了一波(大批浅色+小批深色)。
    入冬了,雪兔们出来觅食,深色兔在雪地中光彩夺目,被雪狐收割了一波(大批深色+小批浅色)。
    (注意:自然选择过程)

    春天到了,又到了兔兔们生孩的季节,雪兔们染色体内的基因进行 重组/不重组 ,产生一批受精卵。
    (注意:交叉遗传过程)

    受精卵内的生命活动非常强烈,造成了基因的 突变/不突变,产生了各种各样奇怪的小雪兔。
    (注意:基因变异过程)

    老雪兔们完成了自己繁衍的使命,全部不知所踪。留下新生代,继续在各种威胁下苟活,这一代叫 I(1)。

    再次入冬入夏,雪兔们又出来觅食。。。。。。再次入冬,觅食。。。。。。入冬,觅食。。。。。。

    就这样,50年后,基因突变和重组造就了种神奇的兔子:夏天褐色,冬天白色,可以轻易躲避雪狐的追捕

    再次入冬入夏,雪兔们又出来觅食。。。。。。再次入冬,觅食。。。。。。入冬,觅食。。。。。。

    这样,50年后,雪地里基本上见不到五颜六色的雪兔了,这时候雪兔们达到了兔生巅峰!

    这就是遗传算法的理论基础,自然选择、交叉、变异、迭代,最终获得最优解。

    注意:算法是根据表现型来进行选择,最终选出最优的表现型及其对应的基因。

    1.2 算法要点

    1.1 编码

    编码是为了把我们的输入参数变成染色体(每个个体只有一条染色体),以便于进行交叉和遗传运算。

    例如我们把雪兔的颜色进行划分, 0-255 (表现型)代表 黑->白 的不同程度,0就是纯黑的,255就是纯白的。

    我们这里只谈一下简单的二进制编码,二进制编码中的每一个二进制位是一个基因,整个数字为染色体。

    那么0-255共有256阶(表现型),我们可以用8位2进制数来表示(基因型)。

    兔色为0的编码为 00000000,兔色为2的编码为 00000010,兔色为255的编码为 11111111。

    1.2 适应度函数

    适应度函数就是个体对环境的适应度,适应度越强的越能产生后代,保留自己的基因及表现型。

    这里,我们假设灰色兔子的适应能力最强,即兔色为128的兔子不会被吃掉,设定函数为:

    在这里插入图片描述

    是一个最大值为128的分段函数,图像如下:
    在这里插入图片描述
    适应度函数的极值点一般是未知的,这里我们为了演示方便,就先展示出来。

    1.3 基本流程

    流程就和雪兔故事一样简单,如下所示:

    在这里插入图片描述

    注意:迭代的终止条件可以不是最大迭代次数,比如规定为种群适应度值的方差小于某个值(即种群表现型趋于一致)。

    2. 代码实例(MATLAB)

    2.1 代码汇总

    遗传算法代码(通用代码):

    function [bestChromosome,fitnessBest]=GA(numOfChromosome,numOfGene,iterationNum)
    %% 函数功能:执行基于自适应遗传算法的卸载决策
    %   输入:
    %       numOfChromosome:染色体数量,即迭代的种群大小
    %       numOfGene:基因的数量,即所用二进制编码的位数
    %       iterationNum:迭代的总次数,达到迭代次数即终止迭代
    %   输出:
    %       bestChromosome:最优的染色体(即最优的输入)
    %       fitnessBest:最优的适应度值(即最优的结果)
    
    %% 随机生成初始种群,种群大小为numOfChromosome,染色体中基因数为numOfGene
    % lastPopulation:上一代的种群(染色体)
    % newPopulation:新一代的种群(染色体)
    % randi([0,1])会产生0或1的整数
    lastPopulation=randi([0,1],numOfChromosome,numOfGene);
    newPopulation=zeros(numOfChromosome,numOfGene);
    
    %% 进行遗传迭代,直至达到最大迭代次数iterationNum
    for iteration=1:iterationNum
        %% 计算所有个体(染色体)的适应度,一共有numOfChromosome个适应度值
        fitnessAll=zeros(1,numOfChromosome);
        for i=1:numOfChromosome
            individual=lastPopulation(i,:);
            fitnessAll(i)=fitnessFunc(individual);
        end
        
        %% 如果达到最大迭代次数,跳出(不能再进行选择遗传和变异了)
        if iteration==iterationNum
            break;
        end
        
        %% 使用轮盘赌法选择numOfChromosome条染色体,种群中个体总数不变
        fitnessSum=sum(fitnessAll);
        fitnessProportion=fitnessAll/fitnessSum;
        % 使用随机数进行numOfChromosome次选择,保持种群中个体数量不变
        for i=1:numOfChromosome
            probability=rand(1);
            proportionSum=0;
            chromosomeIndex=1;
            for j=1:numOfChromosome
                proportionSum=proportionSum+fitnessProportion(j);
                if proportionSum>=probability
                    chromosomeIndex=j;
                    break;
                end
            end
            newPopulation(i,:)=lastPopulation(chromosomeIndex,:);
        end
    
        %% 将染色体进行配对,执行单点交叉
        lastPopulation=newPopulation;
        % 生成从1到numOfChromosome的无序排列,每两个相邻数字进行配对
        coupleAllIndex=randperm(numOfChromosome);
        for i=1:floor(numOfChromosome/2)
            coupleOneIndex=coupleAllIndex(2*i-1:2*i);
            % 定义两条染色体交叉的概率,自己选择
            probability=0.6;
            % 如果生成的随机数在交叉概率内,执行交叉操作
            if rand(i)<probability
                % 随机生成交叉的基因点,将两条基因进行交叉
                crossPosition=randi([1,numOfGene],1);
                newPopulation(coupleOneIndex(1),crossPosition:end)=lastPopulation(coupleOneIndex(2),crossPosition:end);
                newPopulation(coupleOneIndex(2),crossPosition:end)=lastPopulation(coupleOneIndex(1),crossPosition:end);
            end
        end
    
        %% 对每条染色体执行基本位变异操作
        lastPopulation=newPopulation;
        for i=1:numOfChromosome
            % 定义染色体变异的概率,自己选择
            probability=0.2;
            % 如果生成的随机数在变异概率内,执行变异操作
            if rand(1)<probability
                % 选择变异的位置
                mutatePosition=randi([1,numOfGene],1);
                % 将对应基因位置的二进制数反转
                if(lastPopulation(i,mutatePosition)==0)
                    newPopulation(i,mutatePosition)=1;
                else
                    newPopulation(i,mutatePosition)=0;
                end
            end
        end 
        
        %% 完成了一次迭代,更新种群
        lastPopulation=newPopulation;
    end
    
    %% 遗传迭代结束后,获得最优适应度值和对应的基因
    fitnessBest=max(fitnessAll);
    bestChromosome=newPopulation(find(fitnessAll==fitnessBest,1),:);
    

    雪兔例子的适应度计算代码:

    function fitness=fitnessFunc(chromosome)
    %% 函数功能:计算染色体的表现型及其适应度
    % 输入:
    %       chromosome:染色体的基因序列
    % 输出:
    %       fitness:染色体(个体)的适应度值
    
    %% 计算雪兔染色体对应表现型
    len=length(chromosome);
    numList=2.^(len-1:-1:0);
    x=sum(chromosome.*numList);
    
    %% 计算表现型对应的适应度
    if x<128
        fitness=x;
    else
        if x>128
            fitness=256-x;
        else
            fitness=128;
        end
    end
    
    
    

    2.1 初始化种群

    %% 随机生成初始种群,种群大小为numOfChromosome,染色体中基因数为numOfGene
    % lastPopulation:上一代的种群(染色体)
    % newPopulation:新一代的种群(染色体)
    % randi([0,1])会产生0或1的整数
    lastPopulation=randi([0,1],numOfChromosome,numOfGene);
    newPopulation=zeros(numOfChromosome,numOfGene);
    

    这里使用随机数生成函数生成了numOfChromosome条染色体,每条染色体有numOfGene个基因。

    将生成的种群放入lastPopulation中,每一行是一条染色体。

    newPopulation相当于一个辅助数组,存储生成种群的中间结果。

    2.2 计算适应度

        %% 计算所有个体(染色体)的适应度,一共有numOfChromosome个适应度值
        fitnessAll=zeros(1,numOfChromosome);
        for i=1:numOfChromosome
            individual=lastPopulation(i,:);
            fitnessAll(i)=fitnessFunc(individual);
        end
    

    计算种群中所有个体的适应度,即把每一条染色体(个体)都放入适应度函数中,得到适应度结果。

    2.3 迭代终止判断

        %% 如果达到最大迭代次数,跳出(不能再进行选择遗传和变异了)
        if iteration==iterationNum
            break;
        end
    

    计算完适应度,如果达到终止条件,就不再进行选择、遗传和变异了。

    否则你跳出循环时,种群适应度与计算的的适应度不匹配。

    另一种方案:执行选择、遗传、变异,跳出循环后再次计算适应度即可。

    2.4 自然选择(轮盘赌法)

        %% 使用轮盘赌法选择numOfChromosome条染色体,种群中个体总数不变
        fitnessSum=sum(fitnessAll);
        fitnessProportion=fitnessAll/fitnessSum;
        % 使用随机数进行numOfChromosome次选择,保持种群中个体数量不变
        for i=1:numOfChromosome
            probability=rand(1);
            proportionSum=0;
            chromosomeIndex=1;
            for j=1:numOfChromosome
                proportionSum=proportionSum+fitnessProportion(j);
                if proportionSum>=probability
                    chromosomeIndex=j;
                    break;
                end
            end
            newPopulation(i,:)=lastPopulation(chromosomeIndex,:);
        end
    

    计算每个个体适应度占总适应度的比例,总适应度是一个饼图,每个个体占据一定的扇形区域。

    在这里插入图片描述

    然后生成numOfChromosome个0-1的随机数,随机数落在哪个区域,哪个个体便被生存,可重复选择。

    显然,适应度高的个体容易被选择,将自己的基因和表现型遗传下去。

    2.5 配对交叉(单点)

        %% 将染色体进行配对,执行单点交叉
        lastPopulation=newPopulation;
        % 生成从1到numOfChromosome的无序排列,每两个相邻数字进行配对
        coupleAllIndex=randperm(numOfChromosome);
        for i=1:floor(numOfChromosome/2)
            coupleOneIndex=coupleAllIndex(2*i-1:2*i);
            % 定义两条染色体交叉的概率,自己选择
            probability=0.6;
            % 如果生成的随机数在交叉概率内,执行交叉操作
            if rand(i)<probability
                % 随机生成交叉的基因点,将两条基因进行交叉
                crossPosition=randi([1,numOfGene],1);
                newPopulation(coupleOneIndex(1),crossPosition:end)=lastPopulation(coupleOneIndex(2),crossPosition:end);
                newPopulation(coupleOneIndex(2),crossPosition:end)=lastPopulation(coupleOneIndex(1),crossPosition:end);
            end
        end
    

    进行遗传的前提是配对,每两条染色体组合成一对,将两者的部分染色体进行交换。

    单点交叉,顾名思义,选择染色体上的一个基因点,从这个基因点开始的两条染色体片段互换:

    在这里插入图片描述

    2.6 变异(基本位变异)

        %% 对每条染色体执行基本位变异操作
        lastPopulation=newPopulation;
        for i=1:numOfChromosome
            % 定义染色体变异的概率,自己选择
            probability=0.2;
            % 如果生成的随机数在变异概率内,执行变异操作
            if rand(1)<probability
                % 选择变异的位置
                mutatePosition=randi([1,numOfGene],1);
                % 将对应基因位置的二进制数反转
                if(lastPopulation(i,mutatePosition)==0)
                    newPopulation(i,mutatePosition)=1;
                else
                    newPopulation(i,mutatePosition)=0;
                end
            end
        end 
    

    基本位变异就是选择一条染色体上的一个基因点,将其取反。

    如染色体 11111111,选择其第四个基因进行基本位变异, 新染色体变为 11101111

    2.7 获得最优解

    %% 遗传迭代结束后,获得最优适应度值和对应的基因
    fitnessBest=max(fitnessAll);
    bestChromosome=newPopulation(find(fitnessAll==fitnessBest,1),:);
    

    迭代结束之后,我们求出最大的适应度及其对应的染色体(个体),这就是我们需要的最优个体。

    2.8 雪兔遗传结果

    我们运行2.1给出的GA函数,在命令行输入以下代码运行:

    [bestChromosome,fitnessBest]=GA(40,8,60)
    

    40个染色体进行60次迭代。多次这行代码,发现结果可以不同,如下:
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    虽然结果不尽相同,但都接近最优解128,这是遗传算法本身的局限,不一定能获得最优解。

    2.9 改善遗传算法的方法

    通过2.8我们知道,遗传算法有时候只能逼近最优解,那么有什么方法能让他达到更好的逼近效果呢?

    这里有几个方案:

    1. 使用自适应遗传和变异概率
    2. 增加种群中个体数量
    3. 增大迭代次数
    4. 使用双点交叉法
    5. 采用多样的变异方法
    6. 更改编码方式(某些情况)
    7. 更换适应度函数,将个体适应度的差距拉大
    8. 更换选择方法,轮盘赌法是最基本的方法,不科学

    大家可以自行了解,以后可能会继续就这几个方面探讨。

    3. 多多交流!

    展开全文
  • 遗传算法java实例

    2012-10-08 17:45:55
    遗传算法
  • 遗传算法C#实例

    2012-07-11 12:27:03
    遗传算法的三个重要实例噢!想学遗传算法的可以拿去看看啊
  • 遗传算法经典Java实现

    2018-04-12 16:05:41
    遗传算法是解决最优解的。其代码是java实现,且有main函数可以方便自行调试查看运行结果。
  • WORD 格式可编辑 遗传算法 经典学习 Matlab 代码 遗传算法实例 : 也是自己找来的原代码有少许错误本人都已更正了调试运行都通过了的 对于初学者尤其是还没有编程经验的非常有用的一个文件 遗传算法实例 % 下面举例...
  • 遗传算法实例

    2012-10-30 20:03:58
    自己做遗传算法的时候整理的一些关于遗传算法例子,程序完整,也典型,刚开始做遗传算法的朋友可以参考一下
  • 遗传算法 经典学习 Matlab 代码 遗传算法实例: 也是自己找来的原代码有少许错误本人都已更正了调试运 行都通过了的 对于初学者尤其是还没有编程经验的非常有用的一个文件 遗传算法实例 % 下面举例说明遗传算法 % % ...
  • 能运行出来的实例 可供大家进行遗传算法的学习,最痛恨假资源了
  • 遗传算法MATLAB实例

    2010-08-20 18:53:27
    MATLAB遗传算法工具箱函数集实例讲解

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,537
精华内容 5,414
关键字:

遗传算法经典实例