0

我在 Gnu Mathprog 中有一个用于能量模型的代码:

s.t.EBa1_RateOfFuelProduction1{r in REGION, l in TIMESLICE, f in FUEL, t in TECHNOLOGY, m in MODE_OF_OPERATION, y in YEAR: OutputActivityRatio[r,t,f,m,y] <> 0}:
RateOfActivity[r,l,t,m,y]*OutputActivityRatio[r,t,f,m,y]  = RateOfProductionByTechnologyByMode[r,l,t,m,f,y];

s.t.EBa4_RateOfFuelUse1{r in REGION, l in TIMESLICE, f in FUEL, t in TECHNOLOGY, m in MODE_OF_OPERATION, y in YEAR: InputActivityRatio[r,t,f,m,y]<>0}:
RateOfActivity[r,l,t,m,y]*InputActivityRatio[r,t,f,m,y]  = RateOfUseByTechnologyByMode[r,l,t,m,f,y];

我想将这两个约束合二为一,我正在考虑插入两个条件表达式(if)。第一个 if 将被称为技术(t)和燃料(f),其中 OutputActivityRatio<>0 和第二个对于相同的技术(t),它将再次开始检查 f(燃料)以查看 InputActivityRatio<>0。像那样:

s.t.RateOfProduction{r in REGION, l in TIMESLICE, f in FUEL, t in TECHNOLOGY, m in MODE_OF_OPERATION, y in YEAR: OutputActivityRatio[r,t,f,m,y]     <>0}:
  RateOfActivity[r,l,t,m,y]*OutputActivityRatio[r,t,f,m,y]  = RateOfProductionByTechnologyByMode[r,l,t,m,f,y]
  If InputActivityRatio[r,t,ff,m,y]<>0 then 
     RateOfActivity[r,l,t,m,y]*InputActivityRatio[r,t,f,m,y]  = RateOfUseByTechnologyByMode[r,l,t,m,f,y]
  else 0
else 0 ;

我的问题是:是否有可能有两个 if 串联(嵌套 if)并且它们之间也有一个方程?我怎么能写这样的东西?非常感谢!

4

1 回答 1

0

如您的其他问题中所述(关于 mathprog 中的嵌套 if-then-else),mathprog 中没有 If-Then-Else 语句。条件 for 循环的解决方法也不能解决您的问题,因为您只能在数据的预处理或后处理中使用它们(您不能在约束中使用它!)。

但是仍然有可能合并您的约束。如果您的条件是输入或输出为 0,我认为类似以下的方法会起作用。

s.t.RateOfProduction{r in REGION, l in TIMESLICE, f in FUEL, t in TECHNOLOGY, m in MODE_OF_OPERATION, y in YEAR}:
(RateOfActivity[r,l,t,m,y]*OutputActivityRatio[r,t,f,m,y])
+ (RateOfActivity[r,l,t,m,y]*InputActivityRatio[r,t,f,m,y])  
= RateOfProductionByTechnologyByMode[r,l,t,m,f,y];

在左侧求和中,一次乘法将变为零。由于我不知道哪些部分是变量以及哪些参数,因此该解决方案也可能失败(例如,如果同时存在输入和输出并且模型的其余部分不包含正确的边界,则可能会出现问题为了那个原因)

于 2015-08-04T11:51:54.867 回答