遗传算法之二进制编码

2023-11-10

遗传算法的基本步骤

遗传算法 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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

遗传算法之二进制编码 的相关文章

随机推荐

  • P1089 津津的储蓄计划

    题目描述 津津的零花钱一直都是自己管理 每个月的月初妈妈给津津300300元钱 津津会预算这个月的花销 并且总能做到实际花销和预算的相同 为了让津津学习如何储蓄 妈妈提出 津津可以随时把整百的钱存在她那里 到了年末她会加上20 20 还给津
  • Spring 事件发布

    前言 事件发布是 Spring 框架中最容易被忽视的功能之一 但实际上它是一个很有用的功能 使用事件机制可以将同一个应用系统内互相耦合的代码进行解耦 并且可以将事件与 Spring 事务结合起来 实现我们工作中的一些业务需求 和 Sprin
  • 各大知名游戏引擎分析报告

    游戏引擎之争就像编程语言之争一样 在游戏开发圈永远是一个火爆的话题 目前市面上主流的一些游戏引擎 我们来给他们做一些比较 了解他们的历史 特点 为了严谨 备注一下写这个文章的时间编写时间是2021年4月20日 目前国内主流在用的游戏引擎有
  • git未在指定分支修改,保存并切换到正确分支(解决未在指定分支修改问题)

    我们在开发一个需求的时候 可能会忘记切换到开发分支上面 下面是切换到正确分支并保存修改的操作 1 将修改的代码暂存到stash git stash 2 切换到正确的分支 git checkout 正确的分支 3 从stash中取出暂存的代码
  • oracle修改临时表出现已使用的事务正在处理临时表问题

    错误提示 ORA 14450 试图访问已经在使用的事务处理临时表 解决方法 通过第一句sql来查找临时表的object id 然后代入第二局sql来生成第三句sql语句 最后再执行第三句sql语句即可kill session 执行修改表的操
  • 查看Quartz 调度任务 job 的状态

    首先 明确一点什么是 jobkey JobKey jobkey new JobKey name group jobkey相当于一把钥匙连接 所有从 schedule 中 获取 信息的钥匙 如果想获取 初始化信息 则 scheduler ge
  • 使用git rebase压缩提交(commits)

    我使用 git 有一段时间了 但老实说 我很少关注凌乱的提交历史 最近在学习 git rebase 想分享一下如何使用这个命令来压缩整理提交 Commits 五步完成 简而言之 总共有五个步骤 运行git rebase i head x x
  • 【具有路由 WSN 模拟器的随机方式移动】具有路由 WSN 模拟器的随机方式移动(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 经过我们的研究和实践 我们提出了一种具有路
  • vim: 未找到命令

    解决 一键配置所有 yum y install vim 检查是否安装 rpm qa grep vim 出现以下的的命令即安装完毕
  • 如何提高链表的查询效率

    使用跳表 1 链表的变形 跳表 跳表是一种我们不常见的数据结构 但由于其优秀的特性 在工业中 常常被用来代替红黑树 进行查找 插入和删除 Redis的有序集合就是用跳表来实现的 跳表本质上是采用 二分 的思路来改造链表 所以这要求链表必须是
  • HCIP-H12-221练习题

    HCIP H12 221练习题 习题1 由于属性AS PATH不能在AS内起作用 所以规定BGP路由器不会宣告任何从IBGP对等体来的更新信息给其IBGP对等体 A 正确 B 错误 答案 A 习题2 通过重发布命令注入BGP的路由 其Ori
  • Unity3D中的JavaScript语言基础

    Unity中的JS 也称UnityScript 和基于浏览器的JS有比较大的区别 因为UnityScript是基于Mono的 net 的IL语言规范 CLR运行环境 Mono虚拟机 上设计的语言 0 基本概念 Unity3d中的脚本可以与游
  • 使用Matlab对传递函数进行z变换

    一 建立传递函数 在这里插入代码片 s tf s Gc 100 s s 100 二 进行z变换 在这里插入代码片 c2d Gc 0 01 z dsys c2d sys ts method 传函离散 这里面的method有好多种 zoh 零阶
  • (二)Docker部署Tomcat及Web应用

    Docker部署Tomcat及Web应用 这里只拉起一个Tomcat容器 运行一个简单的web项目 确保整个docker可以正常运行 查看Tomcat镜像 docker search tomcat 下载下来官方的镜像Starts最高的那个
  • 【Android】Bluetooth(蓝牙)连接与数据传输(一)

    目录 简介 权限声明 蓝牙扫描 开始扫描 取消扫描 获取蓝牙信息 蓝牙配对 配对 取消配对 获取已配对蓝牙 最终效果 简介 蓝牙技术是一种无线数据和语音通信开放的全球规范 它是基于低成本的近距离无线连接 为固定和移动设备建立通信环境的一种特
  • 若依前后端分离版本,Windows下使用Nginx代理的方式进行部署(全流程,图文教程)

    场景 若依官网 http doc ruoyi vip 前提 服务器上安装Mysql 并将数据库导入 在SpringBoot中的application druid yml配置mysql数据库连接 服务器安装Redis服务端 并在applica
  • 删除文件夹中的重复资源脚本

    usr bin python coding utf 8 import os base目录 path Users mulu1 install Model目录 path1 Users mulu2 def traverse f fs os lis
  • 第20章 通信—硬件 I2C

    一 关于I2C 1 1 I2C 控制器 STM32F103系列的I C控制器 可作为通信主机或从机 因此有四种工作模式可选择 主机发送模式 主机接收模式 从机发送模式 从机接收模式 传输速度上 支持标准模式 Standard mode 最高
  • 高仿QQ微信小程序,我趟过的坑

    距离微信小程序内测版发布已经有十天的时间了 网上对微信小程序的讨论也异常火爆 从发布到现在微信小程序一直占领着各种技术论坛的头条 当然各种平台也对微信小程序有新闻报道 毕竟腾讯在国内影响力还是很大的 我们都知道微信小程序第一天发布内测版 并
  • 遗传算法之二进制编码

    遗传算法的基本步骤 遗传算法 GA 的流程如图所示 Created with Rapha l 2 2 0 编码 把所需要选择的特征进行编号 每一个特征就是一个基因 一个解就是一串基因的组合 为了减少组合数量 在图像中进行分块 然后把每一块看