You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Scipy罚函数的风电机组启停优化及PyWake仿真实现咨询

风电场风机启停优化实现方案

1 优化逻辑梳理

你的需求属于典型的0-1整数规划问题,优化目标为:
最大化 全场总发电量(AEP) - 约束罚项
由于Scipy优化器默认执行最小化求解,我们将目标转换为最小化 -(AEP - 罚项) 即可,其中罚项根据你的实际约束自定义(比如开机数量上限、电网出力限制等,违反约束时罚项为正,降低目标得分)。

2 完整实现代码

import numpy as np
from scipy.optimize import milp, Bounds
from py_wake.examples.data.hornsrev1 import V80 
from py_wake.examples.data.hornsrev1 import Hornsrev1Site
from py_wake import BastankhahGaussian
import function

# 初始化风场和模型参数
site = Hornsrev1Site()
x, y = site.initial_position.T
windTurbines = V80()
wf_model = BastankhahGaussian(site, windTurbines)
wt_count = len(x) # 风机总数量

# 自定义罚函数,可根据实际约束修改
def calculate_penalty(c):
    penalty = 0
    # 示例约束:最多允许开机60台,超出部分每台罚100(罚值要远大于单台风机的AEP贡献,保证约束生效)
    max_on_wt = 60
    on_count = np.sum(c)
    if on_count > max_on_wt:
        penalty += 100 * (on_count - max_on_wt)
    # 可添加更多约束的罚项计算逻辑
    return penalty

# 优化目标函数
def objective(c):
    # 转换为整数类型(避免求解器返回浮点值)
    c = np.round(c).astype(int)
    # 过滤停机风机坐标
    x_new, y_new = function.funC(x, y, c)
    # 仿真计算AEP
    sim_res = wf_model(x_new, y_new, h=None, type=0, wd=None, ws=None)
    total_aep = sim_res.aep().sum().item()
    # 计算罚项
    penalty = calculate_penalty(c)
    # 返回负的净收益,适配最小化求解逻辑
    return -(total_aep - penalty)

# ----------------------
# 方案1:使用MILP求解(适合中小规模风场,风机数<100)
# ----------------------
# 设置变量边界:每个c的取值为0或1,整数类型
bounds = Bounds(lb=np.zeros(wt_count), ub=np.ones(wt_count))
integrality = np.ones(wt_count, dtype=bool) # 所有变量都是整数

# 执行优化
res = milp(objective, bounds=bounds, integrality=integrality, options={"disp": True})

# 输出结果
optimal_c = np.round(res.x).astype(int)
print("最优启停序列c:", optimal_c)
print("最优净发电量:", -res.fun)

# ----------------------
# 方案2:使用差分进化求解(适合大规模风场,鲁棒性更强)
# ----------------------
'''
from scipy.optimize import differential_evolution
# 设置每个变量的取值范围
bounds_de = [(0, 1)] * wt_count
res_de = differential_evolution(objective, bounds=bounds_de, integrality=np.ones(wt_count, dtype=bool), disp=True)
optimal_c = np.round(res_de.x).astype(int)
print("最优启停序列c:", optimal_c)
print("最优净发电量:", -res_de.fun)
'''

3 关键配置说明

  • 罚函数调整:你可以根据实际业务约束修改calculate_penalty的逻辑,比如新增风机检修约束、区域出力限制等,罚值需设置为大于单台风机的AEP贡献,确保违反约束的解会被优先排除
  • 求解器选择:风机数量少于80台时优先用MILP求解,速度更快;风机数量更多时切换为差分进化方案,避免求解时间过长
  • 结果验证:得到最优c序列后可代入你原有的仿真逻辑,直接验证发电量输出是否符合预期

内容的提问来源于stack exchange,提问作者sadra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:57:02