我在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,将引用技术(t)和燃料(f),其中OutputActivityRatio<>0;第二个if,对于相同的技术(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)和它们之间有一个方程?我该怎么写呢?非常感谢!
如您的其他问题(关于mathprog中嵌套的if-then-else)所述,mathprog中没有if-then-else语句。条件for循环的变通方法也不能解决你的问题,因为你只能在数据的预处理或后处理中使用它们(你不能在约束中使用它!)。
但是仍然有可能合并你的约束。如果您的条件是Input或Output为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];
在左边的求和中,一个乘法将变为零。由于我不知道哪些部分是变量,哪些是参数,此解决方案也可能失败(例如,如果同时有输入和输出,并且模型的其余部分不包含正确的边界,则可能会出现问题)