精华内容
下载资源
问答
  • 用matlab编写的经典二进制编码遗传算法算例,求函数最大值并画图,附带注释。
  • 人工智能作业,使用二进制编码遗传进化算法解决TSP问题。
  • 很好的代码,供大家学习
  • 基于单点交叉采用串表示,n(≥2)点交叉与均匀交叉采用环表示的方式,推导出十进制编码遗传算法的模式理论,避免了二进制遗传算法模式理论中把交叉点的选取看作是相互独立的和忽视交叉对染色体生成作用的两点不足,得出了...
  • 研究了遗传算法在寻找函数最优值方面的应用,比较分析了二进制遗传算法和八进制算法的函数优化结果。计算机仿真结果表明二进制编码遗传算法在函数优化中要优于八进制编码遗传算法。
  • 遗传算法二进制编码

    万次阅读 热门讨论 2017-09-05 19:33:43
    遗传算法的基本步骤遗传算法 GA 的流程如图所示:Created with Raphaël 2.1.0编码把所需要选择的特征进行编号,每一个特征就是一个基因,一个解就是一串基因的组合。为了减少组合数量,在图像中进行分块,然后把每...

    遗传算法的基本步骤

    遗传算法 GA 的流程如图所示:

    Created with Raphaël 2.2.0

    编码

    把所需要选择的特征进行编号,每一个特征就是一个基因,一个解就是一串基因的组合。为了减少组合数量,在图像中进行分块,然后把每一块看成一个基因进行组合优化的计算。每个解得基因数量是要通过实验确定的。

    遗传算法不能直接处理问题空间的参数,必须把它们转换成遗传空间的由基因按一定结构组成的染色体或个体。这一转换操作就叫做编码。评估编码策略常采用以下 3 个规范。
    (1) 完备性(Completeness): 问题空间中的所有点(候选解)都能作为 GA 空间中的点(染色体)表现。
    (2) 健全性(Soundness): GA 空间中的染色体能对应所有空间中的候选解。
    (3) 非冗余性(Nonredundancy): 染色体和候选解一一对应。

    目前几种常用的编码技术有二进制编码、浮点数编码、字符编码、编程编码等二进制编码是遗传算法中最常见的编码方法,即由二进制字符集 {0, 1} 产生通常的 0, 1 字符串来表示问题的候选解。它具有以下特点

    (1) 简单易行;
    (2) 符合最小字符集编码原则;
    (3) 便于用模式定理进行分析。

    染色体编码最常用的是二进制编码,对于离散性变量直接进行编码,对于连续性变量先离散化后再编码。

    科普1:SPSS常用的基础操作(2)——连续变量离散化
    (下面的这个地址中详细介绍了什么是连续变量离散化及其必要性)

    人人都是数据咖:http://www.ppvke.com/Blog/archives/44271
    

    科普2:连续特征的离散化:在什么情况下将连续的特征离散化后可以获得更好的效果?

    问答来源于知乎:https://www.zhihu.com/question/31989952
    

    举个例子

    已知一元函数:

    F(x) = xsin(10pi*x)+2 x∈[-1, 2]

    现在要求在既定的区间内找出函数的最大值。

    首先我们可以先用 MATLAB 把该函数的图像画出来:

    clc, clear;
    syms f(x); % 声明函数
    x = linspace(-1,2,3000); % 定义 x, x 属于 [-1, 2]
    f = x.*sin(10*pi.*x)+2; % 定义函数,因为 x 是向量,所以采用点乘
    plot(f); % 画图
    

    然后做出图形如下:

    这里写图片描述

    我们可以看到,该图形显示说明该函数具有多个局部最优解,所以适合用遗传算法进行求解。

    由遗传算法的基本步骤可知我们第一步应该是编码:

    二进制编码

    受到人类染色体结构的启发,我们可以设想一下,假设目前只有 0 和 1 两种碱基,我们也用一条链把它们有序的串连在一起,因为每一个单位都能表现出 1bit 的信息量,所以一条足够长的染色体就能为我们勾勒出一个个体特征的所有特征。这就是二进制编码

    下面将介绍如何建立二进制编码到一个实数的映射。

    明显地,一定长度的二进制编码序列,只能表示一定精度的浮点数。譬如我们要求小数点后精确到六位小数,由于区间长度为

    2 - (-1) = 3
    

    为了保证精度的要求,至少把区间 [-1, 2] 分为 3*10^6 等份。又因为

    2097152=2^21 < 3*10^6 < 2^22=4194304
    

    所以编码的二进制串至少有 22 位。
    把一个二进制串 (b1b2…bn) 转换为区间里面对应的实数值通过下面两个步骤。
    (1) 将一个二进制串代表的二进制转换为十进制数:

    这里写图片描述
    (2) 对应区间的实数:

    这里写图片描述

    或许有人并不知道是如何把数值转换到对应区间的实数的,为什么要这么做?我也是问了一下我的小伙伴才知晓的,下面我来简单的说一下:
    通常我们归一化到 [0, 1],有时候我们需要归一化到其它区间,这样算一下就可以找到数列的最小值 m 及最大值 M,如果指定的区间是 [a, b],即:

    m-->a, M-->b;
    

    系数为:

    k = (b-a)/(M-m)
    

    对任意项Xn:变成:

    X = a+k(Xn-m)
    

    (二进制编码, 很多朋友评论说代码有问题,各位可以帮忙检查一下问题所在,嘻嘻~)
    将十进制转换为二进制的 MATLAB 程序代码如下:

    %% 将十进制数转换为二进制数(二进制编码)
    % @params dec_num 十进制数
    % @params N       需保留的二进制小数位数
    function bin_num = encode(dec_num, N)
    	split = '.';
    	if rem(dec_num, 1) == 0
    		bin_num = dec2bin(dec_num);
    		float_num = zeros(1, N);
            bin_num = strcat(num2str(bin_num), split);
            bin_num = strcat(bin_num, num2str(float_num));
    	else
    		remainder = rem(dec_num, 1); % 小数部分
    		integer = floor(dec_num); % 整数部分
    		bin_num_int = dec2bin(integer);
    		i = 1;
    		flag = true;
    		while(flag == true)
                remainder = remainder*2;
    			if (i > N) % 是否满足精度
    				return;
    			end
    			if remainder > 1
    				record(i) = 1;
                    remainder = rem(remainder, 1);
    			else if remainder == 1
    				record(i) = 1;
    				remainder = rem(remainder, 1);
    			else
    				record(i) = 0;
    			end
    			i = i+1;
    		end
    		bin_num_flt = record;
    		bin_num = strcat(num2str(bin_num_int), split);
    		bin_num = strcat(bin_num, num2str(bin_num_flt));
            end
        end
    end
    

    未完…(有机会再出第二章)

    展开全文
  • 遗传算法(GA)是最著名的进化...在本文中,我们将与您分享遗传算法的两个版本的MATLAB实现:二进制遗传算法和实数编码遗传算法。这些版本中的优化机制是相同的,并且仅在解决方案表示形式和遗传算子的意义上有所不同。
  • 这是用matlab编写的二进制遗传算法程序你可以在其中改写一下变成自己的程序用于自己的用途
  • 本文主要介绍遗传算法(实数编码)的交叉操作中的SBX,模拟二进制交叉。首先,给出个人用python2.7实现的代码,具体模块已上传到:https://github.com/guojun007/sbx_cross#!/usr/bin/env python#encoding:UTF-8import...

    本文主要介绍遗传算法(实数编码)的交叉操作中的SBX,模拟二进制交叉。

    首先,给出个人用python2.7实现的代码,具体模块已上传到:

    https://github.com/guojun007/sbx_cross

    #!/usr/bin/env python

    #encoding:UTF-8

    import numpy as np

    import random

    """

    SBX 模拟二进制交叉

    输入:

    population 种群矩阵

    alfa 交叉概率

    numRangeList 决策变量的上限(下限默认为0)

    mu SBX方式的分布指数, 推荐为1

    """

    def cross(population, alfa, numRangeList, mu=1):

    N=population.shape[0]

    V=population.shape[1]

    populationList=range(N)

    for _ in xrange(N):

    r=random.random()

    if r

    p1, p2=random.sample(populationList, 2)

    bq=np.array([0]*V)

    randList=np.random.random(V)

    #根据概率向量判断不同概率函数的选择

    orTF=(randList<=0.5)

    #计算不同决策变量的 不同概率选择 下的 系数

    for j in xrange(V):

    if orTF[j]==True:

    bq[j]=(2.0*randList[j])**(1.0/(mu+1))

    else:

    bq[j]=(1.0/(2.0*(1-randList[j])))**(1.0/(mu+1))

    #取出选定的两个个体

    old_p1=population[p1, ]

    old_p2=population[p2, ]

    #计算交叉后的两个新个体

    new_p1=0.5*((1+bq)*old_p1+(1-bq)*old_p2)

    new_p2=0.5*((1-bq)*old_p1+(1+bq)*old_p2)

    #上下限判断,防止越界

    new_p1=np.max(np.vstack((new_p1, np.array([0]*V))), 0)

    new_p1=np.min(np.vstack((new_p1, numRangeList)), 0)

    new_p2=np.max(np.vstack((new_p2, np.array([0]*V))), 0)

    new_p2=np.min(np.vstack((new_p2, numRangeList)), 0)

    #将交叉后的个体更新回种群

    population[p1, ]=new_p1

    population[p1, ]=new_p2

    ###以下是测试用例

    if __name__=="__main__":

    random.seed(0)

    np.random.seed(0)

    xN=20

    yN=3

    alfa=0.9

    population=np.random.rand(xN*yN).reshape(xN, yN)*1.0

    ###运行函数

    print population

    print '-'*50

    cross(population, alfa, np.array([1]*3))

    print '-'*50

    print population

    5b6c0215c5d1f35bee9ca7686c846c8e.png

    913f7f2c964f1e7f46ed654d7af0c772.png

    39637a613da8fecf91b733154c0d7d2f.png

    3d2b6b0b8dff1f9db210f9dacaa6e18d.png

    以下内容引至:

    http://blog.csdn.net/silence1214/article/details/48802317

    最近在做作业遇到一个Dejong’s fifth function的multi modal的问题,用传统的GA方法尝试了很多次,的确没办法搞定,随机很多次也不一定在global optimum的地方得到一次解。前几天去导师家里的路上谈到这个事情,导师说一般现在都用SBX和polynomial的mutation。于是回来找了相关论文来看,找到了SBX最早的论文,奇怪的是,在论文中竟然没有给出伪代码,只是在讲解他的motivation。大概的motivation是这样的:

    1:SBX主要是用于real number的编码问题,但是借鉴与来自binary 编码的idea。在binary中,假设2个parent分别为p1和p2,后代分别为c1和c2。那么是这么一个属性的:(p1+p2)/2=(c1+c2)/2。再定义一个叫做spread factor的玩意β=|(c2−c1)/(p2−p1)|

    2:在SBX中就要满足第一个属性,以及尽量β也binary中的概率分布一致。由此一个方案:

    c1=(p2+p1)−0.5∗β(p2−p1)

    c2=(p2+p1)+0.5∗β(p2−p1)

    大家可以自己计算,是满足上面2个玩意的。

    3:那么接下来其实就是求β的,因为是要让在real的问题中的β的分布尽量接近binary中的,那么就要首先知道binary中的分布。binary中的分布如下:

    c(β)=0.5(n+1)βn,β≤1 and c(β)=0.5(n+1)1βn+2,β>1

    也就是说β有2个分布的,具体怎么做呢?我看到有人实现是这么来的。

    3.1:随机一个数字在[0,1]之间,如果该数字小于等于0.5按照第一个来求,否则按照第二个来求。求解的时候是按照对β的概率分布等于这个随机数字来计算的。这个只需要求积分即可,手工就能推导出来。

    最后我用这个方法再加上tournament selection以及polynomial mutation的方法,在求解上面说的multi modal的问题的时候,竟然很多次都求解出来了!

    标准遗传算法(实数编码 python实现)模拟二进制交叉SBX 多项式变异

    代码地址: https://github.com/guojun007/real_sga 本部分是采用实数编码的标准遗传算法,整体流程与上一篇二进制编码的基本一致, 主要区别在于本部分的交叉操作为模拟二 ...

    SBX&lpar;Simulated binary crossover&rpar;模拟二进制交叉算子和DE&lpar;differential evolution&rpar;差分进化算子

    一起来学演化计算-SBX(Simulated binary crossover)模拟二进制交叉算子和DE(differential evolution)差分进化算子 觉得有用的话,欢迎一起讨论相互学习 ...

    多目标遗传算法 ------ NSGA-II (部分源码解析) 交叉操作 crossover&period;c

    遗传算法中的交叉操作是 对NSGA-II  源码分析的  最后一部分, 这一部分也是我 从读该算法源代码和看该算法论文理解偏差最大的  函数模块. 这里,首先提一下,遗传算法的  交叉操作.变异操作都 ...

    Python 字符编码及其文件操作

    本章节内容导航: 1.字符编码:人识别的语言与机器机器识别的语言转化的媒介. 2.字符与字节:字符占多少个字节,字符串转化 3.文件操作:操作硬盘中的一块区域:读写操作 注:浅拷贝与深拷贝 用法: d ...

    字符编码py2&comma;py3操作,SecureCRT的会话编码的设置

    对之前的字符串类型和二进制类型(bytes类型),可以这样关联记忆,把字符串类型当作是Unicode,把bytes类型当作是GBK或者UTF-8或者是日文编码.这样字符串要转成二进制,那么就需要编码e ...

    python学习道路&lpar;day3note&rpar;&lpar;元组,字典 ,集合,字符编码,文件操作&rpar;

    1.元组()元组跟列表一样,但是不能增删改,能查.元组又叫只读列表2个方法 一个 count 一个 index2.字典{}字典是通过key来寻找value因为这里功能比较多,所以写入了一个Code里面 ...

    Python-字典、集合、字符编码、文件操作整理-Day3

    1.字典 1.1.为什么有字典: 有个需求,存所有人的信息 这时候列表就不能轻易的表示完全names = ['stone','liang'] 1.2.元组: 定义符号()t = (1,2,3)tupl ...

    python开发基础之数据类型、字符编码、文件操作

    一.知识点 1.身份运算: 2.现在计算机系统通用的字符编码工作方式:在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码.用记事本编辑的时候,从文件 ...

    随机推荐

    JAVASCRIPT实现网页版:俄罗斯方块

    HTML+CSS+JS实现俄罗斯方块完整版,素材只有图片,想要的下载图片按提示名字保存,css中用的时候注意路径!!主要在JS中!JS附有详细注释 效果: 按键提示:[键盘按键] 素材:图片名字与代码 ...

    iOS-NSDate

    一.概念解释 1.什么是NSTimeZone? NSTimeZone:时区是一个地理名字,是为了克服各个地区或者国家之间在时间上的混乱设定的. 1).GMT:0:00格林威治标准时间:UTC +00: ...

    40w会议投票系统优化方案

    40w会议投票系统优化方案 最近2天谈了一个项目,根据提出的需求是,该系统本来是属于一个大系统的分割出来的一个很小的系统,但是由于是并发关系会耗费资源很大,所以分割出来.据了解,系统采用的mysql+ ...

    iOS开发之数据存储之Preference&lpar;偏好设置&rpar;

    1.概述 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能. 每个应用都有个NSUserDefaults实例,通过它来存取偏好 ...

    cookie和sission的原理及异同

    Cookie Cookie是存储在客户机的文本文件,它们保存了大量轨迹信息.在servlet技术基础上,JSP显然能够提供对HTTP cookie的支持. 通常有三个步骤来识别回头客: 服务器脚本发送 ...

    C&plus;&plus;笔记(2017&sol;2&sol;9)

    this指针 this指针作用就是指向成员函数所作用的对象. 非静态成员函数中可以直接使用this来代表指向该函数作用的对象的指针. 静态成员函数中不能使用this指针. 静态成员 static 定义 ...

    &lpar;转&rpar; MySQL分区与传统的分库分表

    传统的分库分表 原文:http://blog.csdn.net/kobejayandy/article/details/54799579 传统的分库分表都是通过应用层逻辑实现的,对于数据库层面来说,都 ...

    学习Spring Boot:(七)集成Mybatis

    前面都是用的是spring data JPA,现在学习下Mybatis,而且现在Mybatis也像JPA那样支持注解形式了,也非常方便,学习一下. 数据库 mysql 5.7 添加依赖 在pom文件中 ...

    JSON&lowbar;EXTRACT查询mysql中的{}和 &lbrack;&lbrace;&rcub;&comma;&lbrace;&rcub;中的值&rsqb;

    json_extract(a.tag, '$[*].tag_name.cn') as tag, json_extract(a.address,'$.en') as address_name, json ...

    全面认识Docker和基本指令

    Docker逐渐成为虚拟化技术的佼佼者,Java架构师之路接下来会推出一系列的Docker相关技术文章,Docker技术也是架构师的必备技能. 什么是Docker Docker 是一个开源的应用容器引 ...

    展开全文
  • 遗传算法,包括一维二进制,二维二进制和实数编码三种经典算法,经过测试,用于初始阶段学习的最好材料。Matlab程序
  • 遗传算法的python实现(二进制编码),适用于python3.x环境,有详细的注释和两个给出的测试函数。
  • #include#include#include#include#define M 80//种群数量#define LEN 20//编码长度#define xmin -1//下限#define xmax 2//上限#define MMAX (int)pow(2,LEN)//编码长度对应的最大二进制数#define PI 3.1415926#...

    #include

    #include

    #include

    #include

    #define M 80//种群数量

    #define LEN 20//编码长度

    #define xmin -1//下限

    #define xmax 2//上限

    #define MMAX (int)pow(2,LEN)//编码长度对应的最大二进制数

    #define PI 3.1415926

    #define PC 0.8//交叉概率

    #define PM 0.05//变异概率

    #define PD 0.2

    struct Node

    {

    int num,MyBinary[LEN];//num是对应二进制编码的整数值,MyBinary存放二进制编码

    double Myfitness;//Myfitness是适应度

    double Myfitsum;//Myfitsum是适应度占总体适应度的百分比,然后从第一个个体往后累加,主要用于选择操作

    }Nownode[M],Nextnode[M];//本代群体和下一代群体

    int nodeindex[M];//交叉时随机配对,存放配对的群体下标

    int T;

    double fx(double x)//被优化函数

    {

    double y;

    y=x*sin(10*PI*x)+2;

    //y=6-pow(x+6,2);

    //y=sin(0.7*x)/x;

    return y;

    }

    int randn(int temp)//产生0~MMAX之间的随机整数

    {

    return (int)(1.0*rand()/RAND_MAX*temp+0.5);

    }

    double double2double(struct Node node)//把对应的二进制数转化为对应区间的double数

    {

    return xmin+node.num*(xmax-xmin)/(pow(2,LEN)-1);

    }

    int calfitness()//计算适应度

    {

    int i;

    double temp,temp_sum=0,minfitness,maxfitness,avefitness;//minfitness作用是如果出现负的适应度,就做相应的变化

    double a,b,C=1.5;

    for(i=0;i

    {

    temp=double2double(Nownode[i]);

    Nownode[i].Myfitness=fx(temp);

    temp_sum+=Nownode[i].Myfitness;

    if(i==0)

    {

    minfitness=Nownode[i].Myfitness;//i=0时,先给minfitness赋初值

    maxfitness=Nownode[i].Myfitness;

    }

    if(minfitness>Nownode[i].Myfitness)

    {

    minfitness=Nownode[i].Myfitness;

    }

    if(maxfitness

    {

    maxfitness=Nownode[i].Myfitness;

    }

    }

    if(minfitness<0)//如果有负的适应度值,就把所以的适应度都加上一个数,使适应度全都为正数

    {

    temp_sum=0;

    for(i=0;i

    {

    Nownode[i].Myfitness+=-minfitness;

    temp_sum+=Nownode[i].Myfitness;

    }

    }

    //适应度线性变换

    avefitness=temp_sum/M;//计算平均适应度

    if(minfitness>(C*avefitness-maxfitness)/(C-1))

    {

    a=(C-1)*avefitness/(maxfitness-avefitness);

    b=(maxfitness-C*avefitness)*avefitness/(maxfitness-avefitness);

    }

    else

    {

    a=avefitness/(avefitness-minfitness);

    b=minfitness*avefitness/(avefitness-minfitness);

    }

    for(i=0;i

    {

    Nownode[i].Myfitness=a*Nownode[i].Myfitness+b;

    }

    Nownode[0].Myfitsum=Nownode[0].Myfitness;

    for(i=1;i

    {

    Nownode[i].Myfitsum=Nownode[i].Myfitness+Nownode[i-1].Myfitsum;//每一个Myfitsum都是自己的适应度加上前一个的Myfitsum

    }

    for(i=0;i

    {

    Nownode[i].Myfitsum=Nownode[i].Myfitsum/Nownode[M-1].Myfitsum;//每一个Myfitsum除以所有适应度之和,使Myfitsum为0~1之间

    }

    return 0;

    }

    int initpopulation()//初始化种群

    {

    int i,j,temp;

    for(i=0;i

    {

    temp=randn(MMAX);//产生0~MMAX之间的随机整数值

    Nownode[i].num=temp;

    //printf("%d\n",temp);

    for(j=LEN-1;j>=0;j--)

    {

    Nownode[i].MyBinary[j]=temp%2;//给MyBinary赋值

    temp=temp/2;

    }

    }

    calfitness();//计算适应度

    return 0;

    }

    int assignment(struct Node *node1,struct Node *node2)//两个个体之间赋值操作,所以这里必须使用指针,

    {

    int j;

    for(j=0;j

    {

    node1->MyBinary[j]=node2->MyBinary[j];

    }

    node1->num=node2->num;

    node1->Myfitness=node2->Myfitness;

    node1->Myfitsum=node2->Myfitsum;

    return 0;

    }

    int copypopulation()//选择(复制)操作

    {

    int i,num=0;

    double temp;

    while(num

    {

    temp=1.0*rand()/RAND_MAX;//随机生成一个0~1之间的数

    for(i=1;i

    {

    if(temp>=Nownode[i-1].Myfitsum&&temp<=Nownode[i].Myfitsum)

    {

    //Nextnode[num++]=Nownode[i];

    assignment(&Nextnode[num++],&Nownode[i]);//如果满足条件就赋值给下一代

    break;

    }

    }

    }

    for(i=0;i

    {

    //Nownode[i]=Nextnode[i];

    assignment(&Nownode[i],&Nextnode[i]);//更新本代个体

    }

    calfitness();//计算适应度

    return 0;

    }

    int isrepeat(int temp,int num)//交叉时要随机分组,防止出现重复的两个数,此函数检测是否下标重复

    {

    int i;

    for(i=0;i

    {

    if(nodeindex[i]==temp)

    return 1;

    }

    return 0;

    }

    int bin2int(struct Node *node)//把对应的编码转化为整数值

    {

    int j,num=0;;

    for(j=0;j

    {

    num+=(int)(pow(2,LEN-1-j)*(node->MyBinary[j]));

    }

    node->num=num;

    return num;

    }

    int crossposition(struct Node *node1,struct Node *node2,int p)//交叉操作,交叉点为p,参数必须是指针

    {

    int j,temp;

    for(j=LEN-1;j>=LEN-1-p;j--)

    {

    temp=node1->MyBinary[j];

    node1->MyBinary[j]=node2->MyBinary[j];//交换两个个体的编码

    node2->MyBinary[j]=temp;

    }

    bin2int(node1);//交叉完成后更新num值

    bin2int(node2);

    return 1;

    }

    int crossover()

    {

    int i,temp;

    double pc_temp;

    for(i=0;i

    {

    do

    {

    temp=rand()%M;

    } while(isrepeat(temp,i));

    nodeindex[i]=temp;//首先产生了交叉的下标

    }

    for(i=0;i

    {

    temp=rand()%(LEN-1);

    pc_temp=1.0*rand()/RAND_MAX;

    if(pc_temp<=PC)//满足交叉条件就交叉

    {

    crossposition(&Nownode[nodeindex[i]],&Nownode[nodeindex[i+1]],temp);

    }

    }

    calfitness();//计算适应度

    return 1;

    }

    int mutation()//变异操作

    {

    int i,j;

    double pm_temp;

    for(i=0;i

    {

    for(j=0;j

    {

    pm_temp=1.0*rand()/RAND_MAX;

    if(pm_temp<=PM)//满足变异概率就进行变异操作

    {

    Nownode[i].MyBinary[j]=(Nownode[i].MyBinary[j]==0)?1:0;

    }

    }

    bin2int(&Nownode[i]);//更新个体的num值

    }

    calfitness();//计算适应度

    return 1;

    }

    int findmaxfit()//找到适应度最大的个体

    {

    int i,index=0;

    double temp=0;

    for(i=0;i

    {

    if(temp

    {

    index=i;

    temp=Nownode[i].Myfitness;

    }

    }

    return index;

    }

    int displaynode()

    {

    int i,j;

    printf("\n\n下标\tnum值\tx值\t 编码\t\tMyfitness\tMyfitsum\n");

    for(i=0;i

    {

    printf("第%d个\t%d\t%.3lf\t",i,Nownode[i].num,double2double(Nownode[i]));

    for(j=0;j

    {

    printf("%d",Nownode[i].MyBinary[j]);

    }

    printf("\t%.3lf\t\t%.3lf\n",Nownode[i].Myfitness,Nownode[i].Myfitsum);

    }

    return 1;

    }

    int main()

    {

    int index;

    int num=0,num1=0,num2=0;

    srand(time(NULL));

    while(num++<100)

    {

    T=0;

    initpopulation();//初始化群体

    while(T++<=100)

    {

    copypopulation();

    crossover();

    mutation();

    }

    index=findmaxfit();

    if(fabs(double2double(Nownode[index])-1.8)<=0.1)

    {

    num1++;

    }

    else

    {

    num2++;

    }

    }

    printf("正确的结果次数有%d次\n",num1);

    printf("错误的结果次数有%d次\n",num2);

    return 0;

    }

    0818b9ca8b590ca3270a3433284dd417.png

    0818b9ca8b590ca3270a3433284dd417.png

    根据结果可知,计算结果正确的概率在98%以上。

    展开全文
  • Matlab实现遗传算法二进制编码)重点交叉crossover算法
  • 遗传算法 二进制编码 matlab实现

    千次阅读 2020-03-31 18:17:09
    问题1:遗传算法第一步就是要解决编码问题,常用二进制编码,用过matlab的都知道有自带的十进制转换二进制的API,但是生成的char类型变量却不方便完成后续计算适应度、交叉、变异等操作; 问题2:常见实现编码方式为...

    问题介绍

    • 问题1:遗传算法第一步就是要解决编码问题,常用二进制编码,用过matlab的都知道有自带的十进制转换二进制的API,但是生成的char类型变量却不方便完成后续计算适应度、交叉、变异等操作;
    • 问题2:常见实现编码方式为先确定精度,根据目标精度反推最低需要的二进制编码位数然后编码,但是存在的问题是假如函数搜索范围是[-1,2],需要0.001的精度,那么就是3000个数,需要12位二进制编码,但是完整的12位二进制编码可以表示到4096,如果直接用12位编码,那么将会在交叉及变异过程中,生成超出3000的数字,即超出搜索范围;

    解决思路

    • 针对问题1,必须将二进制编码转化为数组形式,才能实现单点交叉 变异等操作;
    • 针对问题2,只能以补满位数为前提,即12位编码,在[-1,2]上分4096个数,精度即为0.0007;
    • 本文拿解决如下函数,编码为例,理论求得最大值3.850
      在这里插入图片描述在这里插入图片描述

    具体实现

    • 首先根据设定的编码位数,生成完整的二进制编码矩阵,利用matlab自带的dec2bin,然后根据转换出来的二进制的length与编码位数对比,将其补0满足设定的编码位数,以下是matlab代码实现
      % 将函数定义域转化为二进制,转化的实数按区间映射   
      % chromosome_size:设定的编码位数,例如本例采用12
      % problem_size:完整二进制编码位数能表示的数值,如12位,能表示到2^12-1=4095
      % problemDB:二进制编码矩阵
      function[] =  ProblemDB_create()
      global problem_size;
      global chromosome_size;
      global problemDB;
      for i = 1:problem_size
          arr = dec2bin(i);
          for j = 1:length(arr)
              problemDB(i,chromosome_size-length(arr)+j) = str2num(arr(1,j));
          end    
      end
      end
      
    • 生成如下矩阵在这里插入图片描述
    • 生成了完整的编码,应该将其对应到函数的搜索区间上去,为了让代码可以复用,应该封装一个函数,可以提供输入区间起始和终止值,根据传入的基因编码计算对应在区间上的真值;具体思路也很简单,将二进制转换为10进制,计算其与完整二进制编码位数最大值的比例即可得知其映射在搜索区间上的真值;
      % 将二进制编码表示的个体转化为函数搜索区间上的实数值   
      % problem_size:同上
      % indiv:个体的二进制编码数组
      % from:搜索区间的起始值
      % to:搜索区间的终止值
      function[val] = realValue(indiv, from, to)
      global problem_size;
      dec = 0;
      for i = 1:length(indiv)
          if(indiv(1,i) == 1)
              dec = dec + 2^(length(indiv)-i);
          end
      end
      val = from + dec/problem_size*(to-from);
      end
      
      在这里插入图片描述

    总结

    • 以上仅仅介绍了遗传算法解函数时的编码部分,交叉变异等其他步骤可以参考我上一篇博客,除了编码部分,修改下适应度函数和变异,其他基本相同,因此变量名都还是组卷的;
    • 由于matlab里循环及数组索引需要从1开始,因此编码及搜索时并没有将0编进去,需要处理此问题的记得修改一下;
    展开全文
  • 使用Matlab实现二进制编码方案的遗传算法,算法分为初始化init.m、编码encoding、解码decoding、交叉crossover、变异mutation、选择selection以及适应度函数的计算。该文件为初始化算法
  • 利用遗传算法求函数f(x)=x+10sin(5x)+7cos(4x)f(x) =x+10sin(5x)+7cos(4x)的最大值
  • matlab基于二进制和实数制编码遗传算法的PID整定3讲
  • 遗传算法二进制编码

    千次阅读 2020-06-01 20:08:34
    假设我们要用遗传算法求解某个函数的最大值,x的取值范围是[-3.0,12.1],那么我们现在就是要从这个取值范围内取出一些x来作为种群的个体,要取出多少个x这取决于你想要种群有多少个体,即种群规模。 如果我们用十...
  • 本程序采用的是二进制编码精确到小数点后五位,经过计算可知对于 其编码长度为18,对于 其编码长度为15,因此每个基于的长度为33。 参数设置 算法步骤 设计的程序主要分为以下步骤:1、参数设置;2、种群初始化;3...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,192
精华内容 2,076
关键字:

二进制编码遗传算法维数