【问题标题】:How to assign 0 and 1 to a decision variable based on other decision variables in OPL如何根据 OPL 中的其他决策变量将 0 和 1 分配给决策变量
【发布时间】:2019-12-12 16:26:48
【问题描述】:

我正在使用 IBM ILOG CPLEX。我有一个二元决策变量 zbt[b][t]。现在我需要根据是否满足以下条件为其分配 0 或 1

sum(b in PitBlocks, i in PitExits, m in Plants, t in TimePeriods) ( Xbimt[b][i][m][t]) + sum( b in PitBlocks, i in PitExits, s in Stockpiles, t in TimePeriods)(Xbist[b][i][s][t]) >= oreTons[b]

Xbimt , Xbist 是决策变量,而浮点 oreTons[b] 是浮点数

我试过了

if (sum(b in PitBlocks, i in PitExits, m in Plants, t in TimePeriods) ( Xbimt[b][i][m][t]) + sum( b in PitBlocks, i in PitExits, s in Stockpiles, t in TimePeriods)(Xbist[b][i][s][t]) >= oreTons[b]) {zbt[b][t]: =1} 否则 {zbt[b][t]:=0} ;

我得到了几个语法错误,比如预期的 =,意外的 else

我正在尝试的部分如下: Zbt = 1 如果

(i=1)^I▒∑(m=1)^M▒∑(t=1)^T▒"Xbimt +" ∑( i=1)^I▒∑(s=1)^S▒∑(t=1)^T▒"Xbist >0" 否则 Zbt = 0

【问题讨论】:

  • 我在上面的帖子中添加:即使像下面这样的东西会有所帮助。但这也会产生错误。 xyz = sum(b in PitBlocks, i in PitExits, m in Plants, t in TimePeriods) Xbimt[b][i][m][t] + sum( b in PitBlocks, i in PitExits, s in Stockpiles, t in TimePeriods) Xbist[b][i][s][t]; forall(b in PitBlocks, t in TimePeriods ) { if (xyz >= oreTons[b]) {zbt[b][t]==1;} else {zbt[b][t]==0;} }

标签: conditional-statements variable-assignment opl


【解决方案1】:

您不能在if 的条件下使用决策变量(这在文档中明确说明)。要为您的约束建模,您可以使用逻辑约束,尤其是隐含运算符:

expression => expression

以你为例

(sum (...) ... >= oreTons[b]) => (decision_variable == 1)

如果满足运算符左侧的条件,则将 decision_variable 强制为 1。

【讨论】:

    猜你喜欢
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 2014-02-25
    相关资源
    最近更新 更多