1

我使用 IBM Optimization Studio CPLEX(OPL) 开发了一个程序,我尝试这样做:

 If (P_p(t) >= (P_L(t))/(Einv ))

 Pb(t) = Pb0+(Eb_c/3600)*(Pp(t)-P_L(t))/Einv)

 t Є {t0,t0+1,,t0+nΔt} , Δt: step time

我做了类似的事情:

maximize ....

subject to {
....

forall(j in NH: Pp[j] >= Pl[j]/Einv)
Pb[j] == Pb0 + (Eb_c/3600)*(Pp[j]- Pl[j]/Einv);

...
}

这给了我这个错误:“不允许决策变量(或表达式)”,我尝试了很多解决方案但它不起作用,我在任何文档、表达式或方法中都找不到的问题? !

编辑

但是我没有什么要补充的来解释这一点,我在我的主题中编写的第一个代码,我应该使用工作室 CPLEX 创建它。

我试图最小化系统产生的电力成本,所以在主题内,我必须检查 T 期间每次模拟的 if 条件,如果 if 条件正确,则执行下一行代码,否则我们将传递给另一个 Pb(t) 值?!

问题是在 if condition 和 inside subject to 中使用采样时间 T!

4

1 回答 1

1

虽然这个问题已经 3 岁了,但我还是会回答,因为这是一个常见问题。

您不能在forallorif语句的条件中使用决策变量。不过,您可以通过逻辑约束来实现您想要的。在您的情况下,您需要的是“隐含”约束(使用“=>”运算符):

forall(j in NH) {
   (Pp[j] >= Pl[j]/Einv) => (Pb[j] == Pb0 + (Eb_c/3600)*(Pp[j]- Pl[j]/Einv));
}

“=>”运算符的右侧仅在左侧为真时才被强制执行。

于 2019-05-02T10:29:35.450 回答