使用分段线性近似的单位组合问题变为 MIQP
unit commitment problem using piecewise-linear approximation become MIQP
我尝试使用 MILP(混合整数线性规划)来计算单元组合问题。
(单位承诺:试图找到最佳发电机调度的优化问题)
有两个优化变量。
发电机功率:P(连续变量)。
使用成本曲线上的哪条线段:BN(二进制变量)。
,用于线性化生成器的二次代价函数
一次只能打开一个线段。所以会有一个约束。
Bn1 + Bn2 + Bn3 <=1
每条线段都有自己的斜率和截距。
我想计算最低成本。
此数学公式表示 1 到 H 小时的成本总和。
这就是我的编码方式:sum(slope1* p * Bn1 +intercept1* Bn1 +slope2* p * Bn2 +intercept2* Bn2 +slope3* p * Bn3 +截距3* Bn3 )
这样,两个优化变量就会相乘。使问题从 MILP 变成 MIQP。
我想问一下有没有什么办法可以在 MILP 中维护我的问题。
谢谢你。
ps : 我使用 python API 的 ibm cplex 来解决优化问题
您可以在 docplex 中使用分段线性。让我分享 zoo and bus example in python:
中的示例
from docplex.mp.model import Model
mdl = Model(name='buses')
nbbus40 = mdl.integer_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
#after 4 buses, additional buses of a given size are cheaper
f=mdl.piecewise(0, [(0, 0),(4,4)], 0.8)
mdl.minimize(f(nbbus40)*500 + f(nbbus30)*400)
mdl.solve()
mdl.export("c:\buses.lp")
for v in mdl.iter_integer_vars():
print(v," = ",v.solution_value)
这给出了
nbBus40 = 0
nbBus30 = 10.0
我尝试使用 MILP(混合整数线性规划)来计算单元组合问题。 (单位承诺:试图找到最佳发电机调度的优化问题)
有两个优化变量。
发电机功率:P(连续变量)。
使用成本曲线上的哪条线段:BN(二进制变量)。
一次只能打开一个线段。所以会有一个约束。 Bn1 + Bn2 + Bn3 <=1
每条线段都有自己的斜率和截距。
我想计算最低成本。
这就是我的编码方式:sum(slope1* p * Bn1 +intercept1* Bn1 +slope2* p * Bn2 +intercept2* Bn2 +slope3* p * Bn3 +截距3* Bn3 )
这样,两个优化变量就会相乘。使问题从 MILP 变成 MIQP。 我想问一下有没有什么办法可以在 MILP 中维护我的问题。 谢谢你。 ps : 我使用 python API 的 ibm cplex 来解决优化问题
您可以在 docplex 中使用分段线性。让我分享 zoo and bus example in python:
中的示例from docplex.mp.model import Model
mdl = Model(name='buses')
nbbus40 = mdl.integer_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
#after 4 buses, additional buses of a given size are cheaper
f=mdl.piecewise(0, [(0, 0),(4,4)], 0.8)
mdl.minimize(f(nbbus40)*500 + f(nbbus30)*400)
mdl.solve()
mdl.export("c:\buses.lp")
for v in mdl.iter_integer_vars():
print(v," = ",v.solution_value)
这给出了
nbBus40 = 0
nbBus30 = 10.0