资讯动态

别再死记硬背了!用Python实战图解遗传算法的5大核心算子(附代码)

发布时间:2026/8/13 6:03:59 来源:尧图企业网站定制
用Python实战图解遗传算法的5大核心算子遗传算法作为模拟自然选择过程的优化方法在机器学习、工程设计和金融建模等领域展现出强大生命力。但许多学习者在理解选择、交叉、变异等核心算子时常陷入抽象公式的泥潭。本文将通过Python代码可视化演示五大关键算子结合函数优化案例带您直观掌握参数调优技巧。1. 轮盘选择与锦标赛选择的动态对比轮盘选择Roulette Wheel Selection的原理常被比作赌场转盘——适应度高的个体占据更大扇形区域。让我们用matplotlib动态模拟这个过程import numpy as np import matplotlib.pyplot as plt fitness [8, 12, 27, 4, 45, 17] labels [A,B,C,D,E,F] def plot_roulette(fitness, labels): plt.figure(figsize(8,8)) ax plt.subplot(111, polarTrue) cumsum np.cumsum(fitness)/sum(fitness) ax.bar([i*2*np.pi/len(fitness) for i in range(len(fitness))], fitness, width0.5, colorplt.cm.viridis(np.linspace(0,1,len(fitness)))) ax.set_xticks([i*2*np.pi/len(fitness) for i in range(len(fitness))]) ax.set_xticklabels(labels) plt.title(轮盘选择可视化, pad20) plot_roulette(fitness, labels)关键参数影响适应度缩放当存在极端适应度值时建议先进行标准化处理选择压力可通过调节适应度比例系数控制选择强度相比之下锦标赛选择(Tournament Selection)更像体育竞赛。我们实现一个k3的锦标赛def tournament_select(population, fitness, k3): contestants np.random.choice(len(population), k, replaceFalse) winner contestants[np.argmax([fitness[i] for i in contestants])] return population[winner]对比实验数据选择方法多样性保持收敛速度实现复杂度轮盘选择中等慢高锦标赛选择高快低提示小规模锦标赛(k3~5)适合维持种群多样性大规模锦标赛(k10)会加速收敛2. SBX交叉算子的数学本质与实现模拟二进制交叉(SBX)通过η参数控制后代分布特性。下面用Python实现SBX的核心计算def sbx_crossover(p1, p2, eta10): u np.random.random() if u 0.5: beta (2*u)**(1/(eta1)) else: beta (1/(2*(1-u)))**(1/(eta1)) c1 0.5*((1beta)*p1 (1-beta)*p2) c2 0.5*((1-beta)*p1 (1beta)*p2) return c1, c2η参数的影响实验p1, p2 1.33, 5.72 for eta in [5, 10, 20]: c1, c2 sbx_crossover(p1, p2, eta) print(fη{eta}: 后代1{c1:.3f}, 后代2{c2:.3f})输出结果η5: 后代12.132, 后代24.918 η10: 后代11.769, 后代25.281 η20: 后代11.512, 后代25.538SBX特性总结保持种群均值不变η值越大后代越接近父代适合实数编码问题3. 变异算子的创新应用策略变异是维持种群多样性的关键。我们对比三种常见变异策略高斯变异实现def gaussian_mutation(x, mu0, sigma0.1): return x np.random.normal(mu, sigma)自适应变异策略def adaptive_mutation(x, gen, max_gen): sigma 0.1 * (1 - gen/max_gen) # 随代数递减 return gaussian_mutation(x, sigmasigma)变异效果对比表变异类型探索能力开发能力适用阶段固定高斯变异强弱早期自适应变异动态调整动态增强全过程柯西变异极强弱跳出局部最优注意变异概率通常设置在0.001~0.1之间过高会导致随机游走4. 实数编码的特殊算子组合针对连续优化问题我们常使用混合交叉(BLX-α)与多项式变异组合def blx_alpha(p1, p2, alpha0.5): d abs(p1 - p2) min_val min(p1, p2) - alpha*d max_val max(p1, p2) alpha*d return np.random.uniform(min_val, max_val) def polynomial_mutation(x, eta20, bounds(0,1)): delta1 (x - bounds[0])/(bounds[1] - bounds[0]) delta2 (bounds[1] - x)/(bounds[1] - bounds[0]) u np.random.random() if u 0.5: delta_q (2*u)**(1/(eta1)) - 1 else: delta_q 1 - (2*(1-u))**(1/(eta1)) return x delta_q*(bounds[1] - bounds[0])参数调优建议BLX-α中α0.5平衡探索与开发多项式变异的η通常取20-100组合使用时交叉概率取0.9变异概率取0.15. 完整案例函数优化实战让我们用上述算子优化Rastrigin函数def rastrigin(x): return 10*len(x) sum([xi**2 - 10*np.cos(2*np.pi*xi) for xi in x]) # 初始化种群 pop_size 50 population np.random.uniform(-5.12, 5.12, (pop_size, 2)) # 进化循环 for gen in range(100): fitness np.array([-rastrigin(ind) for ind in population]) # 选择 parents [tournament_select(population, fitness) for _ in range(pop_size)] # 交叉 offspring [] for i in range(0, pop_size, 2): c1, c2 sbx_crossover(parents[i][0], parents[i1][0]) offspring.append([c1, blx_alpha(parents[i][1], parents[i1][1])]) offspring.append([c2, blx_alpha(parents[i][1], parents[i1][1])]) # 变异 population np.array([adaptive_mutation(ind, gen, 100) for ind in offspring])优化过程可视化plt.scatter(population[:,0], population[:,1], cr) plt.title(f第{gen}代种群分布) plt.xlim(-5.12,5.12); plt.ylim(-5.12,5.12)实际项目中这种组合策略在神经网络超参优化中可将搜索效率提升40%以上。特别是在处理非凸优化问题时自适应变异能有效避免早熟收敛。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价