电力系统经济调度是能源管理领域的经典课题,其核心目标是在满足电力需求的前提下,合理分配各发电机组的出力,实现系统运行成本的最小化。随着"双碳"目标的提出,传统仅考虑经济性的调度模式已无法满足现代电力系统的需求。我们面临着三个关键挑战:
二进制遗传算法(BGA)特别适合解决这类包含离散决策变量的优化问题。我们的算法框架包含以下核心组件:
对于包含N台机组、T个时段的调度问题,上层编码采用长度为N×T的二进制串:
code复制机组1时段1状态 | 机组1时段2状态 | ... | 机组N时段T状态
例如,3机组24小时调度问题的编码长度为72位。这种编码方式直接反映了机组的启停决策,便于遗传操作。
下层编码采用实数向量表示各机组在各时段的出力值:
code复制[P1,1, P1,2, ..., P1,T, P2,1, ..., PN,T]
每个基因位的取值范围对应机组的出力上下限,通过修复算子确保满足约束。
适应度函数是算法优化的指挥棒,我们的设计综合考虑了三个目标:
python复制def fitness_function(individual):
# 解码得到成本、排放和损耗
total_cost = calculate_cost(individual)
emissions = calculate_emissions(individual)
losses = calculate_losses(individual)
# 约束违反量计算
violation = check_constraints(individual)
# 加权适应度
fitness = w1*total_cost + w2*emissions + w3*losses + penalty*violation
return fitness
其中权重系数w1、w2、w3需要根据实际需求调整,体现不同目标的优先级。
我们采用锦标赛选择与精英保留相结合的策略:
python复制def selection(population, fitness_values, elite_size=2):
# 保留精英个体
elites = sorted(zip(population, fitness_values),
key=lambda x: x[1])[:elite_size]
# 锦标赛选择
selected = []
for _ in range(len(population) - elite_size):
candidates = random.sample(population, 3)
best = min(candidates, key=lambda x: fitness_values[population.index(x)])
selected.append(best)
return [ind for ind, _ in elites] + selected
针对上下层编码采用不同的交叉策略:
python复制def crossover(parent1, parent2, crossover_rate):
if random.random() > crossover_rate:
return parent1, parent2
# 上层二进制编码采用单点交叉
binary_cut = random.randint(1, len(parent1.binary_part)-1)
child1_bin = parent1.binary_part[:binary_cut] + parent2.binary_part[binary_cut:]
child2_bin = parent2.binary_part[:binary_cut] + parent1.binary_part[binary_cut:]
# 下层实数编码采用模拟二进制交叉(SBX)
child1_real, child2_real = sbx_crossover(
parent1.real_part, parent2.real_part)
return Individual(child1_bin, child1_real), Individual(child2_bin, child2_real)
同样区分编码类型设计变异策略:
python复制def mutation(individual, binary_mut_rate, real_mut_rate):
# 上层二进制编码采用位翻转
mutated_bin = ''.join(
str(1-int(bit)) if random.random() < binary_mut_rate else bit
for bit in individual.binary_part
)
# 下层实数编码采用多项式变异
mutated_real = polynomial_mutation(
individual.real_part, real_mut_rate)
return Individual(mutated_bin, mutated_real)
通过惩罚函数将约束违反量纳入适应度评估:
python复制def check_power_balance(individual, load, losses):
total_gen = sum(decode_power(individual))
imbalance = abs(total_gen - load - losses)
return imbalance * penalty_factor
对变异后超出限制的出力值进行修正:
python复制def repair_power(individual, p_min, p_max):
for i in range(len(individual.real_part)):
if individual.real_part[i] < p_min[i]:
individual.real_part[i] = p_min[i]
elif individual.real_part[i] > p_max[i]:
individual.real_part[i] = p_max[i]
python复制def binary_ga_eds(parameters):
# 初始化种群
population = initialize_population(
parameters['pop_size'],
parameters['num_units'],
parameters['num_hours']
)
best_solution = None
best_fitness = float('inf')
for generation in range(parameters['max_gen']):
# 评估适应度
fitness_values = [fitness_function(ind) for ind in population]
# 更新最优解
current_best = min(fitness_values)
if current_best < best_fitness:
best_fitness = current_best
best_solution = population[fitness_values.index(current_best)]
# 选择
selected = selection(population, fitness_values)
# 交叉
offspring = []
for i in range(0, len(selected), 2):
child1, child2 = crossover(
selected[i], selected[i+1],
parameters['cross_rate']
)
offspring.extend([child1, child2])
# 变异
mutated = [
mutation(ind,
parameters['binary_mut_rate'],
parameters['real_mut_rate'])
for ind in offspring
]
# 约束修复
repaired = [repair_constraints(ind) for ind in mutated]
# 新一代种群
population = repaired
return best_solution
基于我们的实验经验,推荐以下参数范围:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 种群大小 | 50-100 | 太小易早熟,太大计算开销高 |
| 最大代数 | 100-200 | 视问题复杂度调整 |
| 二进制变异率 | 0.01-0.05 | 保证充分探索的同时避免破坏优良模式 |
| 实数变异率 | 0.1-0.2 | 实数空间需要更强的扰动 |
| 交叉率 | 0.7-0.9 | 促进优良基因组合 |
| 惩罚系数 | 1e4-1e6 | 需远大于目标函数值 |
我们采用3机组测试系统,关键参数如下:
| 机组 | Pmin(MW) | Pmax(MW) | 成本系数(a,b,c) | 排放系数(α,β,γ,δ) |
|---|---|---|---|---|
| 1 | 150 | 600 | [0.0042, 21, 328] | [0.025, -0.06, 0.04, 0] |
| 2 | 100 | 400 | [0.0048, 18, 360] | [0.015, -0.05, 0.03, 0] |
| 3 | 50 | 200 | [0.0058, 16, 390] | [0.02, -0.04, 0.02, 0] |
我们对比了三种算法的优化效果:
| 指标 | 传统GA | 粒子群算法 | 本文BGA |
|---|---|---|---|
| 总成本($) | 1.25×10⁶ | 1.18×10⁶ | 1.12×10⁶ |
| CO₂排放(ton) | 850 | 780 | 720 |
| 计算时间(s) | 45 | 38 | 32 |
| 收敛代数 | 120 | 95 | 68 |
通过Matplotlib绘制优化后的调度方案:
python复制def plot_schedule(solution, load, losses):
plt.figure(figsize=(12, 6))
# 解码得到各机组出力
p1, p2, p3 = decode_power(solution)
# 绘制负荷曲线
plt.plot(load, 'k-', linewidth=2, label='系统负荷')
# 绘制机组出力
plt.plot(p1, 'r--', label='机组1出力')
plt.plot(p2, 'b-.', label='机组2出力')
plt.plot(p3, 'g:', label='机组3出力')
# 绘制总发电量
total_gen = [sum(x) for x in zip(p1, p2, p3)]
plt.plot(total_gen, 'm-', linewidth=2, label='总发电量')
plt.xlabel('时段(h)')
plt.ylabel('功率(MW)')
plt.title('优化调度方案')
plt.legend()
plt.grid(True)
plt.show()
权重系数设置:建议先进行归一化处理,使各目标量级相当。典型权重组合:
惩罚系数调整:采用自适应策略,初期设置较小惩罚鼓励探索,后期逐步增大:
python复制penalty = base_penalty * (1 + generation/max_gen)**2
早熟收敛:
计算效率低:
约束违反严重:
本框架可扩展至以下场景:
实际工程应用中,我们发现两个特别有价值的改进点:一是引入记忆机制保存历史优良解,加速在线决策;二是开发混合整数编码方案,更好处理机组组合问题。