遗传算法

一、遗传算法特点

直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,不需要确定规则就能自动获取和指导优化的搜索空间,自适应的调整搜索方向。

遗传算法并不保证获得问题的最优解,但是使用遗传算法的最大优点是不必去了解和操心如何去“找”最优解。(不必指导袋鼠怎么跳,跳多远)而只要简单的“否定”一些表现不好的个体就行了。

二、基本概念

1 染色体和基因

首先将要解决的问题映射为数学问题,这个问题的一个可行解就被称为“染色体”。一个可行解一般由多个元素构成,那么每一个元素就被称为染色体的一个“基因”。

2 适应度函数

适应度函数也称为评价函数,遗传算法在运行的过程中会迭代N次,每次迭代都会产生若干条染色体。适应度函数会给本次迭代中生成的所有染色体打分,来评判这些染色体的适应度,然后将适应度较低的染色体淘汰掉,只保留适应度较高的染色体,从而经过若干次迭代后染色体的质量将越来越优良。

3 选择函数

我们希望选择适应度高的个体存活下来,并繁衍后代。但是这只是概率上说的而已,毕竟有些适应度低的个体也能存活下来。

下面介绍几种常用的选择算子:

(1) 轮盘赌 (roulette wheel selection):有放回式随机采样方法。每个个体进入下一代的概率等于它的适应度值在整个种群中个体适应度值和的比例。选择误差较大

(2) 随机竞争选择:每次按轮盘赌选择一对个体,然后让这两个个体进行竞争,适应度高的被选中,如此反复,直到选满。

(3) 最佳保留选择:首先按轮盘赌选择方法执行遗传算法的选择操作,然后将当前群体中适应度最高的个体结构完整地复制到下一代群体中。

4 交叉、变异和复制

遗传算法每一次迭代都会生成N条染色体,每次迭代被称为一次“进化”。

(1) 交叉

交叉是从上一代的染色体中寻找两条染色体,一条是爸爸,一条是妈妈。然后将这两条染色体的某个位置切断,并拼接在一起,从而生成一条新的染色体。这条染色体上即包含了一定数量的爸爸的基因,和一定数量的妈妈的基因。

每完成一次进化,都要计算每一条染色体的适应度,计算每条染色体的适应度概率。在交叉时,根据这个概率来选择父母染色体。适应度越大,概率越高。

二进制编码个体或浮点数编码个体的交叉算子:单点交叉、两点交叉、多点交叉、均匀交叉、算术交叉

最简单的是二进制单点交叉

(2) 变异

变异,通过交叉生成了一条新的染色体后,需要在新染色体上随机选择若干个基因,然后随机修改基因的值,从而给现有的染色体引入了新的基因,突破了当前搜索的限制,更有利于算法寻找到全局最优解。

变异算子:基本位变异,均匀变异,边界变异等

(3) 复制

复制,每次进化,需要将上一代中适应度最高的几条染色体直接复制给下一代。通过交叉方式生成N-M条染色体,剩余的M条染色体直接复制上一代适应度最高的M条染色体而来。

三、轮盘赌

轮盘赌:又称为比例选择算子,基本思想是各个个体被选中的概率与其适应度函数值大小成正比。设群体大小为N,个体x_i的适应度为f(x_i),则个体x_i的选择概率为:

轮盘赌选择法可用如下过程模拟来实现:

(1) 在[0, 1]内产生一个均匀分布的随机数r
(2) 若r <= q_1,则染色体x_1被选中
(3) 若q_k-1 <= r <= q_k (2 <= k <= N),则染色体x_k被选中
其中的q_i称为染色体x_i (i=1, 2, ..., N)的积累概率,其计算公式如下图所示:

int RouletteWheelSelection(const vector<double>& probability)
{
	srand(0); //定义rand触发随机值初始值
	double m = rand() / double(RAND_MAX); //产生一个[0, 1]的随机值
	int probability_total = 0;
	int selection = 0;
	for (int i = 0; i < probability.size(); ++i) // size是个体数量的大小
	{
		probability_total = probability_total + probability[i];
		if (probability_total >= m)
		{
			selection = i;
			break;
		}
	}
	return selection;
}

四、算法流程

随机产生一组可行解,即第一代染色体

采用适应度函数计算每一条染色体的适应程度,并根据适应程度计算每条染色体在下一次进化中被选中的概率

        通过交叉,生成N-M条染色体

        对交叉生成的染色体进行编译操作

        用“复制”的方式生成M条染色体

五、进化的次数

1 限定进化次数

2 限定允许范围

六、具体实现细节

1 编码

编码是遗传算法首要解决的问题,编码方法影响到交叉算子、变异算子等遗传算子的运算方法,很大程度上决定了遗传进化的效率。编码方法可以分为三大类:二进制编码法、浮点编码法、符号编码法。

(1) 二进制编码

优点:简单易行、便于实现

缺点:对于一些连续函数的优化问题,由于其随机性能使得其局部搜索能力较差

一定长度的二进制编码序列,只能表示一定精度的浮点数。

(2) 浮点编码

(3) 符号编码

2 简单的小例子

https://www.jianshu.com/p/ae5157c26af9

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值