问题描述
f(x)=x*sin(x)+1, x属于[0,2π] ,以求解f(x)的最大值和最小值问题为例,设计针对f(x)的遗传算法程序,然后进行运行求解
(1)确定基本功能:本实验是实现f(x)的最大值和最小值的求解。
(2)对f(x)进行编码:用一个二进制矢量表示一个染色体,由染色体来代表变量x的实数值。
(3)设计适应度函数:由于要求f(x)的最值,所以适应度函数就是f(x)。
(4)针对f(x)的设计并且实现遗传算法程序:遗传操作主要包括复制、交叉和变异。复制是直接将父代遗传给子代,即根据个体的适应度函数值所度量的优劣程度决定它在下一代是被淘汰还是被遗传。交叉从能进入下一代的个体中选出两个,将两者的部分码值进行交换。变异是根据变异概率选出一个个体,随机对其某位编码进行改变。
(5)设计初始种群:默认设置为50个随机产生的23位字节的染色体,可以通过输入来设置种群规模。
(6)调试交叉和变异概率:在常用的交叉和变异概率范围内,结果随交叉和变异的概率的改变而改变,之间差异相对来说不太明显.
种群初始化
种群初始化的过程就是随机生成种群规模数量的随机二进制编码个体
参考代码
def get_chromosome(size, length):
"""
生成size个长度为length的染色体列表
:param size: 种群规模规模
:param length: 染色体长度
:return: 二维列表
"""
population_temp = []
for i in range(size):
population_temp.append([random.randint(0, 1) for _ in range(length)]) # 生成长度为length的随机二进制列表,并存放到population_temp列表中
return population_temp
计算搜索精度
此处根据精度计算公式:
δ = U x − L x 2 l − 1 \delta = \frac{U_{x} - L_{x}}{2 ^{l} - 1} δ=2l−1Ux−Lx
参考代码
def get_accuracy(min_, max_, length):
"""
计算搜索精度
:param min_: 基因的最小值
:param max_: 基因的最大值
:param length: 染色体长度
:return: 精度
"""
return (max_ - min_) / (2 ** length - 1) # 精度计算公式
染色体解码
此处根据解码公式:
x = L x + δ ∑ i = 1 l A i 2 i − 1 x = L_{x} + \delta \sum_{i=1}^l A_{i} 2^{i-1} x=Lx+δi=1∑lAi2i−1
参考代码
def chromosome_decode(chromosome_list, min_, accuracy_):
"""
染色体解码
:param chromosome_list: 二进制染色体列表
:param min_: 基因的最小值
:param accuracy_: 精度
:return: 解码的结果
"""
decimal = int(''.join([str(i) for i in chromosome_list]), 2

本文介绍如何利用遗传算法解决一维函数的最大值和最小值问题,详细讲解了种群初始化、编码、适应度计算、选择、交叉、变异等遗传算法核心步骤,并提供了完整的Python代码实现。
最低0.47元/天 解锁文章
2437





