【机组组合】基于Benders分解算法解决混合整数规划问题——机组组合问题(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

1.1 问题描述

1.2 数学符号

1.3 数学模型 

1.4 整体数学模型 

Benders分解算法简介

机组组合问题的数学模型

Benders分解算法在机组组合问题中的应用

实际应用与验证

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现


💥1 概述

1.1 问题描述

在电力系统中,高效的资源调度,对于在集中式或竞争性环境中实现经济可靠的能源生产和系统运行是必要的。
机组组合 (Unit Commitment, UC)优化问题旨在于电力系统运行时,给定以及调整发电机组的启停状态以及实时出力,使发电机组的总运行成本最小,且满足一定的安全技术约束 [1],包括发电机出力约束、启停时间约束、启停状态逻辑约束和功率平衡约束等。

1.2 数学符号

 

1.3 数学模型 

1.3.1 目标函数

1.3.2 约束条件

机组出力约束 

启停时间约束 

启停状态逻辑约束 

功率平衡约束 

1.4 整体数学模型 

\begin{array}{l} \min \sum_{g=1}^{N G} \sum_{t=1}^{N T}\left(C_{g}^{L V} p_{g, t}+C_{g}^{N L} u_{g, t}+C_{g}^{S U} v_{g, t}+C_{g}^{S D} w_{g, t}\right) \\ \text { s.t. } \quad\left\{\begin{array}{l} u_{g, t} \underline{P}_{g} \leqslant p_{g, t} \leqslant u_{g, t} \bar{P}_{g} \quad \forall g, t \\ \sum_{i=t-T U_{g}+1}^{t} v_{g, i} \leqslant u_{g, t} \quad \forall g, t \in\left[T U_{g}, T\right] \\ \sum_{i=t-T D_{g}+1}^{t} w_{g, i} \leqslant 1-u_{g, t} \quad \forall g, t \in\left[T D_{g}, T\right] \\ u_{g, t}-u_{g, t-1}=v_{g, t}-w_{g, t} \quad \forall g, t \\ \sum_{g=1}^{N G} p_{g, t} \geqslant D_{t} \quad \forall t \\ \sum_{g=1}^{N G} u_{g, t} \bar{P}_{g} \geqslant D_{t} \quad \forall t \end{array}\right. \end{array}

机组组合问题研究与Benders分解算法

机组组合(Unit Commitment, UC)是电力系统中的一个重要优化问题,旨在在给定的电力系统运行条件下,通过调整发电机组的启停状态和实时出力,使得发电机组的总运行成本最小,同时满足一系列的安全技术约束。这些约束包括发电机出力约束、启停时间约束、启停状态逻辑约束和功率平衡约束等。

Benders分解算法简介

Benders分解算法由Jacques F. Benders在1962年提出,是一种用于求解混合整数规划问题(Mixed Integer Programming Problem, MIP)的有效方法。在MIP中,同时包含整数和连续变量,这使得问题的求解变得复杂。Benders分解算法通过引入复杂变量(complicating variables),并将这些变量固定,从而将原问题分解为相对容易解决的子问题。

机组组合问题的数学模型

机组组合问题的数学模型通常包括目标函数和一系列约束条件。目标函数是发电机组的总运行成本最小化,可以表示为:

\minsumt=1T​sumi=1N​(CiP​Pit​+CiS​Uit​)

其中,CiP​ 是机组i的单位功率成本,Pit​ 是机组i在时段t的功率输出,CiS​ 是机组i的启动成本,Uit​ 是机组i在时段t的启停状态(1表示开机,0表示停机)。

约束条件包括:

  1. 发电与负荷平衡约束:确保所有时段的发电总量等于负荷需求。
  2. 机组有功出力上下限约束:机组输出功率需在规定的上下限内。
  3. 机组最小启停时间约束:机组启动后需要运行一段时间后才能停机,停机后也需要等待一段时间才能再次启动。
  4. 安全约束:如线路功率限制等,确保电网安全稳定运行。

Benders分解算法在机组组合问题中的应用

在机组组合问题中,Benders分解算法的基本思想是将原问题分解为两个子问题:

  1. 主问题(Master Problem):只包含整数变量(如机组的启停状态),通过迭代求解来逼近最优解。
  2. 子问题(Subproblem):在给定整数变量值的情况下,解决一个线性规划问题,即确定发电机组的出力。

算法流程如下:

  1. 初始化:设定主问题的初始解和上下界。
  2. 求解子问题:在给定整数变量值的情况下,求解线性规划问题,得到连续变量的最优解和子问题的目标函数值。
  3. 更新主问题:根据子问题的解,在主问题中加入新的约束(Benders割),并求解更新后的主问题。
  4. 迭代:重复步骤2和3,直到满足收敛条件(如上下界之间的间隙小于设定阈值)。

实际应用与验证

Benders分解算法在机组组合问题中的应用已经得到了广泛的研究和验证。通过IEEE-RTS等实际电力系统算例的验证,证明了该算法在求解安全约束机组组合问题上的有效性和实用性。此外,该算法还兼容了现有的成型算法,不会显著增加计算负担。

综上所述,基于Benders分解算法解决机组组合问题是一种有效且实用的方法,能够在满足电力系统安全约束的前提下,实现发电机组的优化调度。

📚2 运行结果

   部分代码:

  %% Step 3: Solve MP2 to obtain a new lower bound solution z_LB w.r.t. y_hat
    r_MP=gurobi(MP,MP.params);
    assign(recover(r_model.used_variables(Ind_y)),r_MP.x(2:end)); % exclude varialbe z in MP
    s_u_BD((3*iter-2):3*iter,:)=value(u);
    s_v_BD((3*iter-2):3*iter,:)=value(v);
    s_w_BD((3*iter-2):3*iter,:)=value(w);
    z_LB=r_MP.objval;
    iter=iter+1;
%     abs_error=abs((z_UB-z_LB)/z_UB);
%     display(['Upper Bound: ', num2str(z_UB),'  Lower Bound: ', num2str(z_LB),'  Gap: ',num2str(round(abs_error*100,2)),'%']);
end
t_BD_e = toc(t_BD_s);  
display(['采用Gurobi+benders分解所用计算时间: ',num2str(round(t_BD_e,2)),' s']);

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

[1] G. Morales-España, J. M. Latorre and A. Ramos, ”Tight and Compact MILP Formulation
for the Thermal Unit Commitment Problem,” in IEEE Transactions on Power Systems,
vol. 28, no. 4, pp. 4897-4908, Nov. 2013, doi: 10.1109/TPWRS.2013.22514

🌈4 Matlab代码实现

MATLAB里,使用Gurobi作为优化工具包来编写Benders分解算法处理混合整数规划(MIP)的一般步骤如下: ```matlab % 首先,需要安装Gurobi MATLAB工具箱,如果还没有安装,可以在这里下载:https://www.gurobi.com/downloads/gurobi-matlab/ % 导入必要的库 import gurobi.* % 定义问题数据 m = Model(); % 创建一个新模型 numVariables = ...; % 可变数的数量 numContinuous = ...; % 连续变量的数量 numInteger = ...; % 整数变量的数量 % 添加连续和整数变量 for i = 1:numContinuous v = m.addVar(lb = ..., ub = ..., Type = GRB.CONTINUOUS); % lb和ub是下界和上界 end for i = 1:numInteger v = m.addVar(lb = ..., ub = ..., Type = GRB.INTEGER); % 同样设置下界和上界 end % 设定目标函数 obj = ...; % 目标函数系数 m.setObjective(obj, GRB.MAXIMIZE); % 主问题部分 subProblemModel = ...; % 分解后的子问题模型,可能是一个MIP本身 % Benders切割条件 cuts = ...; % 根据子问题求得的切割条件,通常是一组二次或者线性不等式 % 添加Benders切割 for cut in cuts m.addConstr(cut); end % 开始解决问题 m.optimize; % 检查Benders可行解是否满足原始问题 feasibleCut = ...; % 判断子问题解是否可行,如若不可行,则添加新的切割 while ~feasibleCut subProblemSolution = ...; % 解决问题并获取解 feasibleCut = ...; % 判别并更新切割 if ~feasibleCut m.update(); m.optimize; end end % 最终结果 solution = get(m, 'X'); % 获取最优解 ``` 请注意,这个示例代码中省略了一些具体的细节,比如变量定义、目标函数设置、子问题模型构建等,你需要根据实际的MIP问题结构填充这些部分。最后,记得运行`m.optimize`来执行整个Benders分解过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值