优化算法-遗传算法

优化算法-遗传算法

主要参考了集体智慧编程一书

之前已经实现过优化算法中的爬山法和模拟退火法,现在我们讨论一下另一种受自然科学启发的算法:遗传算法。借鉴生物进化论,遗传算法将要解决的问题模拟成一个生物进化的过程,通过复制、交叉、突变等操作产生下一代的解,并逐步淘汰掉适应度函数值低的解,留下适应度函数值高的解。这样进化N代后就很有可能会进化出适应度函数值很高的个体。

一. 遗传算法流程

1.首先我们要初始化一组解(数量为事先设定的种群大小)。

2.现在我们要使目标函数最小,那么我们要逐步淘汰掉使目标函数值高的解,留下使目标函数值小的解,再将留下来的解通过复制、交叉、突变等操作产生下一代的解(比如我们留下使目标函数值最小的20%解,然后基于这最小的20%解复制、交叉、突变等操作产生下一代解),恢复种群原来的大小。

3.然后开始重复第二步操作,直到达到结束条件。

二. 遗传算法的基本操作

使用遗传算法需要先将问题的解进行编码。最简单的一种编码方式是二进制编码,即将问题的解编码成二进制位数组的形式。例如,问题的解是整数,那么可以将其编码成二进制位数组的形式,当然也可以直接使用这些整数作为编码(适用于解的维度比较大的情况)。

遗传算法有3个最基本的操作:选择,交叉,变异。

  • 1.选择: 我们将当前种群中最优的一部分解加入其所在的新种群中,而将当前种群中不属于最优的一部分解淘汰。选取最优一般是按比例选取,这个在前文已经有了介绍。

  • 2.交叉:这种方法是在新种群中选取之前步骤加入的最优解中的两个解,然后将它们按照某种方式结合。实现交叉的简单方法是:选出两个最优解后,从一个最优解中随机选取一个数,将此数之前的值作为新解的前面元素的值,而剩余的元素来源于另一个选出的最优解。

交叉操作python实现:

# 交叉操作
# vec1和vec2是选出两个最优解
# dismension是一个解的维度len(range_list)
def crossover(vec1, vec2, dimension):
    # 选出交叉位置
    i = random.randi
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值