CPLEX 中的分段线性规划

Posted

技术标签:

【中文标题】CPLEX 中的分段线性规划【英文标题】:Piecewise linear programming in CPLEX 【发布时间】:2022-01-20 01:32:11 【问题描述】:

我在 CPLEX 中构建运输成本表达式时遇到问题。特别是,它是物料流的分段线性函数,反映了规模经济。考虑从工厂到仓库的运输成本,我们将 T[f][j][m] 和 Qf1[f][j][m][r] 表示为从工厂 j 运输家庭 f 的产品的基准运输成本分别到仓库 m 和产品族 f 的物料从工厂 j 到仓库 m 的流动。 r 代表流所属的范围。这是代码

sum(f in Fa, j in Pl, m in Wh, r in ra)
piecewise(t in 1..NbPieces-1)  Coef[t]*T[f][j][m] -> Breakpoint[t]; Coef[NbPieces]*T[f][j][m] Qf1[f][j][m][r];

这是我的 .dat 文件

 NbPieces=4;
 Coef=[1, 0.95, 0.89, 0.8];
 Breakpoint=[40, 100, 1000];

但是,程序无法提取表达式。有人可以帮我解决这个错误吗?

编辑:谢谢,Alex Fleischer!我修复了上面的那个。但是,仍然没有达到最佳解决方案。我想我确实犯了其他错误。当我添加约束以确保每个产品系列中的产品流量总和必须等于该产品系列从一个阶段到另一个阶段的流量时,我不确定它是否正确。

这是我的约束代码,Q2 是产品 i 从仓库 m 到配送中心 k 的流量,Qf2 是产品系列 f 从仓库 m 到配送中心 k 的流量。系列 1 包括产品 1-6、10。系列 2:7-9,系列 3:11-14。

  forall (i in pr, m in Wh, k in DC)
    sum(i in pr:i<=6 || i==10) Q2[i][m][k] == sum(r in ra,f in Fa:f==1)Qf2[f][m][k][r];
  forall (i in pr, m in Wh, k in DC)
    sum(i in pr:i<=9 || i>=7) Q2[i][m][k] == sum(r in ra,f in Fa:f==2)Qf2[f][m][k][r];
  forall (i in pr, m in Wh, k in DC)
    sum(i in pr:i>=11) Q2[i][m][k] == sum(r in ra,f in Fa:f==3)Qf2[f][m][k][r];

【问题讨论】:

你得到哪个错误?您能否分享 .mod 和 .dat 以便其他用户可以尝试提供帮助? 您好,感谢您的回复。错误表示“CPLEX(默认)无法提取表达式”。这是我的 .mod 和 .dat 文件的链接:drive.google.com/drive/u/3/folders/…。 【参考方案1】:

你有超出范围的错误,但如果你改变了

sum(f in Fa, k in DC, l in CZ, r in ra) 
piecewise(t in 1..NbPieces-1) Coef[t]*T3[f][k][l] -> Breakpoint[t]; Coef[NbPieces]*T3[f][k][l] Qf2[f][k][l][r];

进入

sum(f in Fa, k in DC, l in CZ, r in ra) 
piecewise(t in 1..NbPieces-1) Coef[t]*T3[f][k][l] -> Breakpoint[t]; Coef[NbPieces]*T3[f][k][l] Qf3[f][k][l][r];

然后就可以了。你确定这里有 Qf2 吗? Qf3 工作正常

【讨论】:

它有效,这是我输入 Qf2 而不是 Qf3 时的错误。非常感谢你的帮助!然而,我遇到了另一个问题。程序仍然没有得到最优解。我认为还有一些其他的错误。当我编辑我的问题时,你能再次检查问题吗?

以上是关于CPLEX 中的分段线性规划的主要内容,如果未能解决你的问题,请参考以下文章

如何用python结合cplex求解混合整数规划问题

PYQT5项目实践|实现Python+cplex 求解模型后,写入GUI小程序中,具体实践包括: CPLEX 的 求解整数规划模型和求解结果以表的形式输出在GUI界面中

cplex 试用版

装箱问题的CPLEX求解

Matlab随笔之分段线性函数化为线性规划

relu函数为分段线性函数,为什么会增加非线性元素