Optimization 使用IBM CPLEX python API的分段函数,但问题无法解决

Optimization 使用IBM CPLEX python API的分段函数,但问题无法解决,optimization,linear-programming,cplex,piecewise,docplex,Optimization,Linear Programming,Cplex,Piecewise,Docplex,我尝试使用MILP(混合整数线性规划)来计算机组组合问题。(机组组合:试图找到发电机最佳调度的优化问题) 因为发电机功率和成本之间的关系是二次函数,所以我使用分段函数将功率转换为成本 我修改了本页上的答案: 简单的程序结构如下所示: 来自docplex.mp.model导入模型 mdl=型号(名称=‘总线’) nbbus40=mdl.integer\u变量(name='nbbus40') nbbus30=mdl.integer\u变量(name='nbbus30') mdl.add_约束(nb

我尝试使用MILP(混合整数线性规划)来计算机组组合问题。(机组组合:试图找到发电机最佳调度的优化问题) 因为发电机功率和成本之间的关系是二次函数,所以我使用分段函数将功率转换为成本

我修改了本页上的答案:

简单的程序结构如下所示:

来自docplex.mp.model导入模型
mdl=型号(名称=‘总线’)
nbbus40=mdl.integer\u变量(name='nbbus40')
nbbus30=mdl.integer\u变量(name='nbbus30')
mdl.add_约束(nbbus40*40+nbbus30*30>=300,‘孩子’)
#在4辆公交车之后,一定尺寸的额外公交车更便宜
f1=mdl.分段(0,[(0,0),(42000),(104400)],0.8)
f2=mdl.分段(0,[(0,0),(41600),(103520)],0.8)
成本1=f1(nbbus40)
成本2=f2(nbbus30)
mdl.最小化(成本1+成本1)
mdl.solve()
mdl.报告()
对于mdl.iter_integer_vars()中的v:
打印(v,“=”,v.solution\u值)

* model buses solved with objective = 3520.000
nbBus40  =  0
nbBus30  =  10.0 
答案是完美的,但没有办法应用我的例子。 我使用一个分段函数来建立功率和成本之间的分段线性关系,得到一个新对象(cost1),然后计算该对象的最小值。 以下是我的实际代码(简单): (min1,miny1),(pw1_1,pw1_1y),(pw1_2,pw1_2y),(max1,max1)是电力成本曲线上的断点

pwl_func_1phase=ucpm.分段(0,[(0,0),(min1,miny1),(pw1_1,pw1_1y),(pw1_2,pw1_2y),(max1,maxy1)],0)
#df_decision_vars_spining是一个数据帧存储优化变量
在[(单位,期间),“可变成本”]=pwl函数1阶段(在[(单位,期间),“生产”]时,df决策变量纺纱)
总可变成本=ucpm.sum((df决策可变成本))
ucpm.最小化(总可变成本)
我不知道是什么原因导致这个优化问题无法解决。
这是我的完整代码:

不是答案,而是为了说明我的评论

假设我们有成本曲线

cost = α + β⋅power^2
此外,我们正在最大限度地降低成本

我们可以用几条线性曲线来近似。我在这里画了一些:

假设每条线性曲线都有

cost = a(i) + b(i)⋅power
对于
i=1,…,n
n
=线性曲线数)

很容易看出我们写的是:

min cost
cost ≥ a(i) + b(i)⋅power   ∀i
我们对二次成本曲线有很好的近似。这正是我在评论中所说的


这里没有使用二进制变量

使用无限制版本的CPLEX,您的模型可以解决问题(尽管速度非常慢)。这里有两个方法可以更好地控制solve()中发生的事情

  • 使用solve(log_output=True)打印日志:您将看到差距缩小
  • 设置mip间隙:将mip间隙设置为5%将在36秒时停止求解

    ucpm.parameters.mip.tolerations.mipgap=0.05

    ucpm.solve(日志输出=True)


  • 模型是否使用线性obj求解?甚至没有obj?注意,您的obj可以简单地用
    min cost建模;成本>=a(i)+b(i)*幂
    适用于所有线性近似曲线(即不需要二进制变量)。你所说的“问题无法解决”到底是什么意思?你有错误吗?这个模型需要很长时间才能解决吗?最终的优化状态是什么?@ErwinKalvelagen斜率随功率变化(斜率=分段(功率))。如果您使用a(i)+b(i)*幂,该方法将导致问题成为miqp问题,请参阅:@rkersh:问题需要很长时间来计算。最终无法找到解决方案。我将在下面解释谢谢您的回答。据我所知,这种方法会遇到一个问题:如何让计算机知道在计算成本时使用哪个斜率和截距?我对这个问题的看法是设置最佳二进制变量Bn成本=总和(斜率1*p*Bn1+intercept1*Bn1+slope2*p*Bn2+intercept2*Bn2+slope3*p*Bn3+intercept3*Bn3)。但正如我在前面的问题[1]中遇到的,这将把问题转化为MIQP.[1]:所有这些都需要遵守。当然,通常只有一个是有约束力的。你可以把这个拿给你的老师看,他会解释的。这是电力系统建模中的一个标准公式,您应该将其放在工具箱中。从您发送的日志中,我看到您的问题有1800个变量,并且解决失败,超出了community edition问题的大小(1000个变量,1000个约束)。无限版解决了这个问题(虽然很慢)。谢谢你的建议,我用你的方法解决这个问题。