
1. 项目背景与核心价值微网系统作为分布式能源的重要载体正在重塑传统电力供应的格局。在这个风光柴油机等多种能源设备协同工作的复杂系统中如何实现各发电单元的最优组合与调度一直是能源工程师面临的现实挑战。遗传算法Genetic Algorithm, GA这类仿生优化方法恰好为解决这类组合优化问题提供了新思路。我最初接触这个课题是在2018年参与一个海岛微网项目时。当时项目组尝试了多种传统优化方法要么陷入局部最优解要么计算时间难以接受。直到引入遗传算法后才在合理时间内获得了令人满意的设备调度方案。这段经历让我深刻认识到对于包含风光等波动性电源的微网系统遗传算法在解决高维非线性优化问题上具有独特优势。本教程将从一个真实的海岛微网案例出发带你用Python实现完整的遗传算法优化过程。与常见教程不同我们特别注重每个代码段都配有工程视角的详细注释关键参数设置都附带实际项目经验说明特别标注了初学者容易误解的算法细节提供可复用的代码框架而非片段重要提示本案例使用的数据已做脱敏处理但保留了真实微网项目的核心特征。建议读者先通读全文理解整体逻辑再动手实践代码。2. 微网系统建模基础2.1 典型微网架构解析在我们着手编写算法前必须明确优化对象的结构特征。图示为一个典型的海岛微网结构注实际代码中将用矩阵表示[光伏阵列] ---- [直流母线] | [风力发电机] ---- [交流/直流变换器] ---- [主配电板] | [柴油发电机] ---- [同步控制器] | [储能电池] ---- [双向变流器]这种架构下各发电设备具有截然不同的特性光伏/风机出力取决于天气具有强随机性柴油机可调但存在最小运行时间约束储能系统充放电效率影响经济性2.2 优化目标函数构建在遗传算法中适应度函数直接决定进化方向。对于微网系统我们通常考虑三个核心指标运行成本最小化def calc_cost(diesel_output, battery_action): diesel_cost sum(diesel_output) * DIESEL_PRICE battery_wear abs(battery_action) * BATTERY_COEFF return diesel_cost battery_wear可再生能源利用率最大化def renew_utilization(pv_output, wind_output, load): return (pv_output wind_output) / load电压波动最小化简化版def voltage_stability(power_diff): return 1 / (1 np.std(power_diff))最终适应度函数需加权整合这三个指标。在实际项目中权重系数需要与业主反复确认——这是初学者常忽略的关键步骤。3. 遗传算法实现详解3.1 染色体编码设计微网调度问题的解可以表示为24小时各设备的出力计划。我们采用实数编码方案# 基因结构示例[柴油机功率1, 电池动作1, 柴油机功率2, 电池动作2,...] individual [0.5, -0.2, 0.6, 0.1, ...] # 长度4824小时×2个设备 # 解码函数 def decode(individual, hour): diesel individual[2*hour] * DIESEL_MAX battery individual[2*hour1] * BATTERY_RATE return diesel, battery工程经验实数编码比二进制编码更适应连续变量优化但需要设计合理的缩放系数。DIESEL_MAX应根据具体机型额定功率设定。3.2 关键算子实现选择操作锦标赛选择def tournament_selection(population, fitness, k3): selected [] for _ in range(len(population)): candidates random.sample(range(len(population)), k) winner max(candidates, keylambda x: fitness[x]) selected.append(population[winner]) return selected交叉操作模拟二进制交叉def sbx_crossover(parent1, parent2, eta20): child1, child2 [], [] for u, v in zip(parent1, parent2): rand random.random() if rand 0.5: beta (2*rand)**(1/(eta1)) else: beta (1/(2*(1-rand)))**(1/(eta1)) child1.append(0.5*((1beta)*u (1-beta)*v)) child2.append(0.5*((1-beta)*u (1beta)*v)) return child1, child2变异操作多项式变异def polynomial_mutation(individual, eta20, mut_prob0.1): mutated [] for gene in individual: if random.random() mut_prob: delta min(gene, 1-gene) u random.random() if u 0.5: delta_q (2*u)**(1/(eta1)) - 1 else: delta_q 1 - (2*(1-u))**(1/(eta1)) mutated.append(gene delta_q*delta) else: mutated.append(gene) return mutated调试技巧eta参数控制变异强度通常取10-30。初期建议设为20后期根据收敛情况调整。4. 完整算法流程与关键参数4.1 主循环架构def genetic_algorithm(): # 初始化 population init_population(POP_SIZE, GENE_LENGTH) best_fitness -float(inf) for generation in range(MAX_GEN): # 评估 fitness [evaluate(ind) for ind in population] # 记录最优解 current_best max(fitness) if current_best best_fitness: best_fitness current_best best_individual population[fitness.index(current_best)] # 选择 selected tournament_selection(population, fitness) # 交叉 offspring [] for i in range(0, len(selected), 2): child1, child2 sbx_crossover(selected[i], selected[i1]) offspring.extend([child1, child2]) # 变异 mutated_offspring [polynomial_mutation(ind) for ind in offspring] # 新一代种群 population elitism(population, mutated_offspring, fitness) return best_individual4.2 关键参数设置建议根据多个实际项目经验推荐以下参数范围参数推荐值作用说明调整策略POP_SIZE50-100种群规模问题复杂度↑ → 取值↑MAX_GEN100-200最大迭代次数收敛速度慢时适当增加CROSSOVER_RATE0.7-0.9交叉概率早熟收敛时降低多样性不足时提高MUTATION_RATE0.01-0.1变异概率局部搜索能力不足时适当提高TOURNAMENT_K3-5锦标赛选择参数选择压力调节阀实测发现对于24小时调度问题POP_SIZE80、MAX_GEN150通常能在计算耗时和解质量间取得较好平衡。5. 典型问题与调试技巧5.1 早熟收敛对策现象算法在20代内就收敛到次优解。解决方法增加突变概率如从0.05调到0.1采用自适应变异率def adaptive_mutation_rate(generation): base_rate 0.05 return base_rate * (1 generation/MAX_GEN)引入移民策略每5代随机替换10%的个体5.2 约束处理技巧微网优化需处理多种约束柴油机最小运行时间通常≥2小时电池SOC限制20%-90%建议采用罚函数法def penalty_function(individual): penalty 0 # 检查柴油机约束 for i in range(0, len(individual), 2): if 0 individual[i] DIESEL_MIN: penalty 1000 * (DIESEL_MIN - individual[i]) # 检查电池SOC soc INIT_SOC for i in range(1, len(individual), 2): soc individual[i] * TIME_STEP if soc SOC_MIN or soc SOC_MAX: penalty 5000 return penalty5.3 并行计算加速对于大规模问题可用multiprocessing加速适应度计算from multiprocessing import Pool def parallel_evaluate(population): with Pool(processes4) as pool: fitness pool.map(evaluate, population) return fitness实测数据在8核机器上评估速度提升5-6倍。6. 可视化与结果分析6.1 进化过程监控plt.plot(best_fitness_history, labelBest) plt.plot(avg_fitness_history, labelAverage) plt.xlabel(Generation) plt.ylabel(Fitness) plt.legend() plt.show()典型收敛曲线应呈现前20代快速上升中期波动收敛后期趋于稳定6.2 最优调度方案展示def plot_schedule(best_individual): hours range(24) diesel [best_individual[2*i] * DIESEL_MAX for i in hours] battery [best_individual[2*i1] * BATTERY_RATE for i in hours] plt.figure(figsize(10,5)) plt.plot(hours, diesel, r-, labelDiesel) plt.plot(hours, battery, b--, labelBattery) plt.xlabel(Hour) plt.ylabel(Power (kW)) plt.legend() plt.grid()分析要点柴油机是否避免频繁启停电池是否在电价高峰时段放电风光充足时是否降低柴油机出力7. 工程实践建议经过多个项目的验证我总结出以下经验数据预处理风光预测数据需进行移动平均滤波消除异常波动。实测发现3小时窗口效果较好from scipy.signal import savgol_filter pv_smoothed savgol_filter(raw_pv, window_length3, polyorder1)多目标处理当成本与环保指标冲突时可采用NSGA-II等算法。简单场景下加权法更易实施def evaluate(individual): cost calc_cost(individual) renew renew_utilization(individual) return 0.7*(1/cost) 0.3*renew # 权重需根据优先级调整硬件在环测试算法部署前建议使用OPAL-RT等实时仿真器验证控制逻辑。我们曾发现算法在1秒控制周期下会出现超调问题后通过增加功率变化率约束解决。持续优化机制实际运行中建议每天用最新数据重新训练算法。可保存历史最优个体作为初始种群的热启动new_population [load_best_individual()] init_population(POP_SIZE-1)对于初学者建议先从单日调度问题入手逐步扩展到多日优化。完整项目代码框架已上传至GitHub仓库地址见文末包含可配置的算法参数文件测试数据集Jupyter Notebook教程常见错误排查指南这个领域最令人兴奋的是当看到算法实际降低了一个偏远村庄10%的发电成本时那种技术改变生活的真实成就感。希望本教程能帮你跨出能源优化的第一步。