遗传算法 二进制编码 matlab实现

问题介绍

  • 问题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实现_第1张图片

具体实现

  • 首先根据设定的编码位数,生成完整的二进制编码矩阵,利用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
    
  • 生成如下矩阵遗传算法 二进制编码 matlab实现_第2张图片
  • 生成了完整的编码,应该将其对应到函数的搜索区间上去,为了让代码可以复用,应该封装一个函数,可以提供输入区间起始和终止值,根据传入的基因编码计算对应在区间上的真值;具体思路也很简单,将二进制转换为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实现_第3张图片

总结

  • 以上仅仅介绍了遗传算法解函数时的编码部分,交叉变异等其他步骤可以参考我上一篇博客,除了编码部分,修改下适应度函数和变异,其他基本相同,因此变量名都还是组卷的;
  • 由于matlab里循环及数组索引需要从1开始,因此编码及搜索时并没有将0编进去,需要处理此问题的记得修改一下;

你可能感兴趣的:(遗传算法 二进制编码 matlab实现)