我尝试使用 MILP(混合整数线性规划)来计算单位承诺问题。(机组承诺:一个试图寻找发电机最佳调度的优化问题) 因为发电机功率和成本之间的关系是二次函数,所以我使用分段函数将功率转换为成本。
我修改此页面上的答案:在此处输入链接描述
简单的程序结构如下:
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
f1=mdl.piecewise(0, [(0,0),(4,2000),(10,4400)], 0.8)
f2=mdl.piecewise(0, [(0,0),(4,1600),(10,3520)], 0.8)
cost1= f1(nbbus40)
cost2 = f2(nbbus30)
mdl.minimize(cost1+ cost1)
mdl.solve()
mdl.report()
for v in mdl.iter_integer_vars():
print(v," = ",v.solution_value)
这使
* model buses solved with objective = 3520.000
nbBus40 = 0
nbBus30 = 10.0
答案是完美的,但没有办法应用我的例子。我用分段函数制定了功率和成本之间的分段线性关系,得到了一个新的对象(cost1),然后计算出这个对象的最小值。以下是我的实际代码(简单): 在此处输入图片描述(min1,miny1), (pw1_1,pw1_1y),(pw1_2,pw1_2y),(max1,maxy1)是功耗-成本曲线上的断点
pwl_func_1phase = ucpm.piecewise(0, [(0,0),(min1,miny1), (pw1_1,pw1_1y),(pw1_2,pw1_2y),(max1,maxy1)], 0)
#df_decision_vars_spinning is a dataframe store Optimization variables
df_decision_vars_spinning.at[(units,period),'variable_cost'] = pwl_func_1phase(df_decision_vars_spinning.at[(units,period),'production'] )
total_variable_cost = ucpm.sum((df_decision_vars_spinning.variable_cost))
ucpm.minimize(total_variable_cost )
我不知道是什么原因导致这个优化问题无法解决。这是我的完整代码:https ://colab.research.google.com/drive/1JSKfOf0Vzo3E3FywsxcDdOz4sAwCgOHd?usp=sharing