Python中带环保约束的PSO经济调度优化问题及报错咨询
经济能源调度PSO模型相关问题解答
1. 燃料成本-功率曲线可视化
x轴应该设为机组实际输出功率(energy[i]),y轴是该功率对应的实际燃料成本,而非直接使用成本系数。成本系数是计算成本的参数(比如常用二次成本模型:cost = a*P² + b*P + c,其中a、b、c是cost_coefficients中的元素),直接用系数画曲线没有实际意义。
简单可视化代码示例:
import matplotlib.pyplot as plt import numpy as np # 某机组的成本系数a,b,c a, b, c = 0.001, 2, 10 # 机组功率范围(下限到上限) P_min, P_max = 50, 200 # 生成功率序列 P = np.linspace(P_min, P_max, 100) # 计算对应成本 cost = a * P**2 + b * P + c plt.plot(P, cost) plt.xlabel('机组输出功率 (MW)') plt.ylabel('燃料成本 ($)') plt.title('单机组燃料成本-功率曲线') plt.show()
2. 添加环保约束表达式
以SO₂、NOₓ、CO₂三种污染物为例,先定义单机组排放模型,再设置约束条件:
步骤1:定义污染物排放模型
- SO₂排放:
E_SO2_i = α_i * energy[i]² + β_i * energy[i] + γ_i - NOₓ排放:
E_NOx_i = δ_i * energy[i]² + ε_i * energy[i] + ζ_i - CO₂排放:
E_CO2_i = η_i * energy[i](线性模型,CO₂排放与功率近似线性相关)
其中α_i、β_i等为各机组的排放系数,需根据实际数据或文献取值。
步骤2:设置约束条件
可选择总量约束或单机组约束:
- 总量约束:所有机组的污染物排放总和不超过允许限值
# SO₂总量约束 sum(α_i * energy[i]**2 + β_i * energy[i] + γ_i for i in units) ≤ SO2_total_limit # NOₓ总量约束 sum(δ_i * energy[i]**2 + ε_i * energy[i] + ζ_i for i in units) ≤ NOx_total_limit # CO₂总量约束 sum(η_i * energy[i] for i in units) ≤ CO2_total_limit - 单机组约束:每个机组的污染物排放不超过单台限值
for i in units: α_i * energy[i]**2 + β_i * energy[i] + γ_i ≤ SO2_unit_limit[i] δ_i * energy[i]**2 + ε_i * energy[i] + ζ_i ≤ NOx_unit_limit[i] η_i * energy[i] ≤ CO2_unit_limit[i]
步骤3:PSO中约束的处理
常用两种处理方式:
- 约束截断:生成/更新粒子位置(各机组功率)后,检查是否满足约束,不满足则调整到可行域内(比如超过排放限值就降低功率至刚好满足)。
- 罚函数法:将约束违反量加入目标函数,转化为无约束优化:
def fitness(energy): # 计算原始成本 cost = sum(cost_coefficients[i] * energy[i] for i in units) # 计算污染物约束违反量 so2_violation = max(0, sum(α_i*energy[i]**2+β_i*energy[i]+γ_i for i in units) - SO2_total_limit) nox_violation = max(0, sum(δ_i*energy[i]**2+ε_i*energy[i]+ζ_i for i in units) - NOx_total_limit) co2_violation = max(0, sum(η_i*energy[i] for i in units) - CO2_total_limit) # 加入罚项(K为惩罚系数,需根据实际调整) penalty = K * (so2_violation + nox_violation + co2_violation) return cost + penalty
3. 解决「TypeError: 'NoneType' object is not subscriptable」报错
该错误核心是你尝试对None值使用下标(比如var[0]),常见场景及解决方法:
- 关键变量未正确初始化:比如
cost_coefficients、energy数组被赋值为None,却尝试用cost_coefficients[i]访问。解决:检查变量赋值代码,比如读取成本系数的文件路径是否正确、CSV文件是否存在,打印变量确认是否为None。 - 函数返回None却被用下标访问:比如调用了无return语句的函数,返回
None后仍取下标。解决:检查函数定义,确保返回预期的数组或值。 - PSO粒子位置未正确生成:初始化粒子位置时代码错误导致数组为
None。解决:检查粒子初始化代码,确保用numpy生成有效数组,比如:# 正确初始化方式 particles = np.random.uniform(low=P_min, high=P_max, size=(n_particles, n_units))
排查时可在报错行前添加print语句,输出相关变量的类型和值,快速定位哪个变量是None。
内容的提问来源于stack exchange,提问作者Lfbaq
相关产品推荐
相关产品推荐

