优化算法-遗传算法
主要参考了集体智慧编程一书
之前已经实现过优化算法中的爬山法和模拟退火法,现在我们讨论一下另一种受自然科学启发的算法:遗传算法。借鉴生物进化论,遗传算法将要解决的问题模拟成一个生物进化的过程,通过复制、交叉、突变等操作产生下一代的解,并逐步淘汰掉适应度函数值低的解,留下适应度函数值高的解。这样进化N代后就很有可能会进化出适应度函数值很高的个体。
一. 遗传算法流程
1.首先我们要初始化一组解(数量为事先设定的种群大小)。
2.现在我们要使目标函数最小,那么我们要逐步淘汰掉使目标函数值高的解,留下使目标函数值小的解,再将留下来的解通过复制、交叉、突变等操作产生下一代的解(比如我们留下使目标函数值最小的20%解,然后基于这最小的20%解复制、交叉、突变等操作产生下一代解),恢复种群原来的大小。
3.然后开始重复第二步操作,直到达到结束条件。
二. 遗传算法的基本操作
使用遗传算法需要先将问题的解进行编码。最简单的一种编码方式是二进制编码,即将问题的解编码成二进制位数组的形式。例如,问题的解是整数,那么可以将其编码成二进制位数组的形式,当然也可以直接使用这些整数作为编码(适用于解的维度比较大的情况)。
遗传算法有3个最基本的操作:选择,交叉,变异。
1.选择: 我们将当前种群中最优的一部分解加入其所在的新种群中,而将当前种群中不属于最优的一部分解淘汰。选取最优一般是按比例选取,这个在前文已经有了介绍。
2.交叉:这种方法是在新种群中选取之前步骤加入的最优解中的两个解,然后将它们按照某种方式结合。实现交叉的简单方法是:选出两个最优解后,从一个最优解中随机选取一个数,将此数之前的值作为新解的前面元素的值,而剩余的元素来源于另一个选出的最优解。
交叉操作python实现:
# 交叉操作
# vec1和vec2是选出两个最优解
# dismension是一个解的维度len(range_list)
def crossover(vec1, vec2, dimension):
# 选出交叉位置
i = random.randi