纯Python实现遗传算法详解与实战步骤

栗子
栗子
发布时间:2026-10-11 | 2人浏览过
原创

遗传算法通过模拟自然选择与基因重组机制求解复杂优化问题。本文详细拆解纯Python实现流程,涵盖二进制基因编码、适应度评估、交叉突变操作及多代迭代循环,提供完整可运行的目标函数测试案例与参数调优指南。

遗传算法核心原理与准备条件

遗传算法(GA)的核心在于种群演进。每个候选解以染色体形式存在,通过适应度函数筛选优势个体,并在复制、交叉与突变的驱动下不断迭代,最终逼近全局最优解。在实际编程中,染色体可采用字符串或二进制序列表示,迭代过程即为进化周期。本实现专注于Python实现,采用二进制编码处理连续区间变量,确保精度可控且便于跨平台部署。

第1步:定义染色体编码与解码函数

目的:将连续空间的浮点变量映射为固定长度的二进制串,并提供逆运算恢复原值。
入口:输入变量当前值、取值边界与期望精度。
动作:根据解空间跨度与精度要求自动计算所需二进制位数(N),逐位提取商与余数完成编码;解码时按权重建模并叠加基础偏移量。
重要参数:解范围最小值(xL)、最大值(xR)、精度(pre)、二进制位宽(N)。
完成状态:函数返回形状匹配的 0/1 数组,可直接用于后续遗传操作。

# 必需依赖前置导入
import numpy as np
from itertools import chain

# x为变量,xL为解范围的最小值,pre为精度,N为二进制解的个数
def codeOne(x, xL, pre, N):
    x = int((x-xL)/pre)
    return [(x//2**i)%2 for i in range(N)]

# xs为一组变量, xL, xR为变量区间, pre为精度
def coding(xs, xL, xR, pre):
    N = int(np.ceil(np.log2((xR-xL)/pre)))
    xs = [codeOne(x, xL, pre, N) for x in xs]
    return np.array(list(chain(*xs)))

# 解码是编码的逆过程
def decodeOne(b, xL, pre, N):
    x = np.sum([b[i]*2**i for i in range(N)])
    return xL + x*pre

def decoding(bins, xL, xR, pre):
    N = int(np.ceil(np.log2((xR-xL)/pre)))
    M = int(len(bins)/N)
    return [decodeOne(bins[N*i:N*(i+1)], xL, pre, N) 
        for i in range(M)]

第2步:实现交叉与变异操作

目的:模拟生物基因重组,打破局部极值锁定,提升种群多样性。
入口:传入两条父代编码串、编码总长度及位置索引数组。
动作:对索引进行随机洗牌,截取连续片段互换位置(交叉);或按预设数量随机翻转比特位(突变)。该策略无需硬编码交叉点,灵活性较高。
重要参数:编码长度(M)、突变点数(nMuta)。
完成状态:返回已完成基因重组的子代序列,保持原有数据类型与维度。

from random import randint

def cross(b1, b2, M, index):
    np.random.shuffle(index)
    i1 = index[:randint(0,M)]
    np.random.shuffle(index)
    i2 = index[:randint(0,M)]
    b1[i1], b2[i2] = b2[i1], b1[i2]

第3步:封装单代进化与淘汰逻辑

目的:执行一代完整的优胜劣汰循环,包含适应度计算、劣种剔除、基因重组与形态恢复。
入口:当前种群列表、目标函数、区间边界、精度、突变率控制数与淘汰数。
动作:遍历计算适应度并排序,将最差的个体替换为最优个体副本;随后对全部编码执行交叉配对与随机点突变;最后批量解码回浮点坐标。
重要参数:个体总数(N)、每代淘汰数(nDie)、变异点数(nMuta)。
完成状态:返回新一代种群矩阵及当代全局最佳适应度值。

def genetic(xs, func, xL, xR, pre, nMuta, nDie):
    N = len(xs)
    fs = [func(x) for x in xs]
    index = np.argsort(fs)
    fBest = fs[index[0]]
    # 将最差的淘汰掉,将最优的提取出来
    xs[index[-nDie:]] = xs[index[:nDie]]
    # 编码
    bs = [coding(x, xL, xR, pre) for x in xs]
    M = len(bs[0])      # 此为编码后的参数长度
    index = np.arange(M)
    # 交叉
    for i in range(N//2):
        cross(bs[i*2], bs[i*2+1], int(M/2), index)
    # 此为突变点个数
    for b in bs:
        np.random.shuffle(index)
        b[index[:nMuta]] = ~b[index[:nMuta]]
    # 最后解码并输出
    xs = [decoding(b, xL, xR, pre) for b in bs]
    return np.array(xs), fBest

第4步:构建主循环与运行测试

目的:启动迭代引擎,持续繁衍直至满足指定代数,输出最终寻优结果。
入口:目标函数、种群规模、变量维度、最大迭代次数、取值范围与各项控制参数。
动作:在指定区间内均匀随机生成初始种群;进入循环逐代调用进化函数;每间隔固定步数打印最佳适应度演变轨迹;终止前检索最低适应度对应的参数组合。
重要参数:个体数(nId)、维度(nDim)、迭代次数(nIter)、范围(xRange)、变异概率系数(rMuta)、淘汰数(nDie)。
完成状态:控制台输出历代迭代数据与最终收敛参数。

def GA(func, nId, nDim, nIter, 
    xRange, pre, rMuta, nDie):
    xs = [uniRand(*xRange, nDim) for _ in range(nId)]
    xs = np.array(xs)
    for i in range(nIter):
        xs, fBest = genetic(xs, func, xRange[0], xRange[1],
            pre, rMuta, nDie)
        if i%20==0:
            msg = f"第{i}次迭代,最佳结果为{fBest}"
            print(msg)
    fs = [func(x) for x in xs]
    index = np.argmin(fs)
    msg = "当前参数:" + ",".join([f"{x}" for x in xs[index]])
    print(msg)

配套测试函数与执行日志如下:

from numpy.random import uniform as uniRand

def test(xs):
    _sum = 0.0
    for i in range(len(xs)):
        _sum = _sum + np.cos((xs[i]*i)/5)*(i+1)
    return _sum

if __name__ == "__main__":
    GA(test, 30, 5, 101, (-5,5), 1e-6, 2, 2)
输出示例:

>python GA.py
第0次迭代,最佳结果为-6.109745260005657
第20次迭代,最佳结果为-11.73854686214257
第40次迭代,最佳结果为-11.656344079309445
第60次迭代,最佳结果为-11.366187890697542
第80次迭代,最佳结果为-11.526653664416903
第100次迭代,最佳结果为-11.329056280514049
当前参数:8.073827999999999,11.655532000000001,7.032817,4.2005289999999995,-4.371395

关键参数调整与常见问题排查

在将此 遗传算法 应用于实际业务时,需注意以下细节以确保稳定收敛:
• 编码精度匹配:二进制位数直接决定解空间粒度。若变量跨度大但精度要求极高(如1e-6),需适当增加N值,否则会导致早期锁定错误区间。
• 适应度函数设计:函数应具备明确的梯度导向或平滑地形,剧烈震荡的非凸目标函数易使种群陷入无效漂移。建议先进行标准化处理。
• 交叉与变异平衡:突变点数(nMuta)过高会退化为随机搜索,过低则丧失跳出局部最优能力。可根据迭代阶段动态调整比例。

以上就是纯Python实现遗传算法代码详解与实战配置的详细内容,更多关于遗传算法调优与优化求解的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表