遗传算法:从生物遗传中领悟智能优化门道

一、遗传算法的产生

(一) 遗传算法的产生历程

  1. 早在50年代,一些生物学家开始研究运用数字计算机模拟生物的自然遗传与自然进化过程;
  2. 1963年,德国柏林技术大学的I. Rechenberg和H. P. Schwefel,做风洞实验时,产生了进化策略的初步思想;
  3. 60年代,L. J. Fogel在设计有限态自动机时提出进化规划的 思想。1966年Fogel等出版了《基于模拟进化的人工智能》,系统阐述了进化规划的思想;
  4. 60年代中期,美国Michigan大学的J. H. Holland教授提出借鉴生物自然遗传的基本原理用于自然和人工系统的自适应行为研究和串编码技术;
  5. 1967年,他的学生J. D. Bagley在博士论文中首次提出“遗传 算法(Genetic Algorithms)”一词;
  6. 1975年,Holland出版了著名的“Adaptation in Natural andArtificial Systems” ,标志遗传算法的诞生
  7. 70年代初,Holland提出了“模式定理”(Schema Theorem),一般认为是“遗传算法的基本定理”,从而奠定了遗传算法研究的理论基础;
  8. 1985年,在美国召开了第一届遗传算法国际会议,并且成立了国际遗传算法学会(ISGA,International Society of Genetic Algorithms);
  9. 1991年,L. Davis编辑出版了《遗传算法手册》,收编了遗传算法在工程技术和社会生活中大量的应用实例。

(二) 与GA相关的重要学术期刊与国际会议

1. 重要学术期刊:
  • IEEE Transactions on Evolutionary Computation
  • Evolutionary Computation
2. 重要国际会议:
  • International Conference on Genetic Algorithm
  • ACM Genetic and Evolutionary Computation Conference
  • Workshop on Foundations of Genetic Algorithms and
  • Classifier Systems
  • Genetic Programming Conference
  • International Workshop on Artificial Life
  • ……

二、遗传算法基本结构

Holland所提出的遗传算法常被称为简单遗传算法(SGA),这是一种基本的遗传算法,其遗传进化操作过程简单,容易理解,是其它一些遗传算法的雏形和基础。

基本遗传算法的组成:

  1. 编码(产生初始种群)
  2. 适应度函数
  3. 遗传算子(选择、交叉、变异)
  4. 运行参数

三、遗传算法实例

考虑下面的优化问题:

\max{f(x_1,x_2)}=21.5+x_1\sin{4\pi x_1}+x_2\sin{20\pi x_2}

-3.0\le x_1 \le 12.1

4.1\le x_2 \le 5.8

【要求解的精度为小数点后4位】

上面这个函数就是我们要优化的目标,即求解 f() 的最大值,所以称为“目标函数”。

目标函数的三维图形如下图所示:

(一) 步骤1. 个体的编码

问题的可能解为实数对 (x_1,x_2) 的形式。这里首先将每个变量编码为二进制位串,然后将表示各个变量的二进制数串连接起来便得到问题可能解的一种表示。表示每个变量的二进制位串的长度取决于变量的定义域和所要求的精度。

让我们来一步一步理解编码的过程:

1. 假设 a_j \le x_j \le b_j ,所要求的精度为小数点后 t 位。这要求将区间划分为至少 (b_j-a_j)10^t 份。

  • 为什么要这样划分呢?让我来慢慢给你讲。
  • 例如在该问题中,-3.0\le x_1 \le 12.1 ,要求解的精度为小数点后4位,也就是说,如果我想在这个区间里找到一个最优解,我就得从 x_1=-3.0000 开始,每次增加 0.0001,即 x_1=-2.9999, x_1 = -2.9998,... 直到 x_1=12.1000,分别将这么多数依次代入到目标函数中,看看哪个数的结果最好。
  • 所以我们就至少要将 x_1 分为 (12.1-(-3.0))\times10^4=151000 份。

  • 为什么说是至少呢?因为题目要求的精度是小数点后4位,我们当然也可以分为更多份,以获得更高的精度,但对于解决这道题来说,就不是很有必要啦。
  • 同理,因为 4.1\le x_2 \le 5.8,所以我们可以知道 x_2 的区间至少划分为 (5.8-4.1)\times 10000=17000 份。

2. 假设表示变量 x_j 的二进制位串 substring_j 的长度用 l_j 表示,则 l_j 可取为满足下列不等式的最小整数 m:(b_j-a_j)10^t \le 2^m-1,即有 2^{l_j-1}-1 < (b_j-a_j)10^t \le 2^{l_j}-1

  • 怎么理解这一步呢?
  • 例如我们刚刚计算出来 x_1 要分为 151000 份,那相应的,x_1 的二进制编码就至少需要有 151000 种变化方式。
  • 我们知道对于二进制数来说,1 位的二进制数有 2 种组合,2 位的二进制数有 4 种组合……17 位的二进制数有 131072 种组合,18 位的二进制数有 262144 种组合。诶,我们发现 17 位没办法满足 151000 种变化,而 18 位可以,所以 x_1 的二进制编码至少需要有 18 位!

  • 按照这个思路,将求编码位数的过程转换成通用公式应该是 (b_j-a_j)10^t \le 2^m,诶?怎么和上面的公式不太一样?为什么上面的公式里有个减一?

  • 试想如果 1\le x_1 \le 5,精度为整数,即保留小数点后0位,那么按照之前的思路计算,我们应该将区间分为 (5-1)\times10^0=4 份,但是实际上可能的解应该是 1、2、3、4、5,一共五个,这是因为在计算 (5-1) 的时候实际上计算的是两个数之间的差距,就像从一楼到五楼爬了几层楼,而我们需要计算的是从一楼到五楼一共有几层楼?因此计算出来需要划分的分数应该加上一个1才是合理的,即 (b_j-a_j)10^t+1 份。

  • 所以计算二进制数位数的公式就变成了 (b_j-a_j)10^t+1 \le 2^m 也就是上面写出来的形式啦。

  • 由此,我们可以计算出来表示变量 x_1 的二进制位串的长度为 l_1=18,表示变量 x_2 的二进制位串的长度为 l_2=15

  • 表示问题解的二进制位串如下图所示:(其中18表示变量 x_115表示变量 x_2

3. 将 x_j 的二进制表示转换回十进制可按下式计算:x_j=a_j+decimal(substring_j)\times \frac{b_j-a_j}{2^{l_j}-1}

其中 decimal(substring_j) 表示变量 x_j 的二进制子串 substring_j 对应的十进制数。

例如给定下列 33 位二进制位串:010001001011010000111110010100010

那么前 18 位所表示的变量 x_1 的值为:

而后 15 位所表示的变量 x_2 的值为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aaron_Chou313

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值