我对CPLEX很陌生,我的一个约束问题 .
我只需要总结一下尊重某一条件的条款:
我先写了
forall(r in RangeR, w in RangeW, d in RangeD, h in RangeH){
sum(k in RangeK) sum(j in RangeJ) rc[j][r] * sum(g in max(0,h-p[j]+1)..h) x[k][j][w][d][g] <= ra[r][w][d][h];
}
当然,这让我得到了经典的“无法提取表达”的错误 . 我尝试通过不同地编写约束来绕过此错误:
forall(r in RangeR, w in RangeW, d in RangeD, h in RangeH){
sum(k in RangeK) sum(j in RangeJ) rc[j][r]*sum (g in RangeH)(g >= h - p[j]+1 && g <= h)*x[k][j][w][d][g] <= ra[r][w][d][h];
}
如果我理解正确,括号之间的表达式应该在每次条件为真时计数 .
通过这种重构,我不再有“无法提取表达式”错误(事实上我不再有错误),但解决方案中没有考虑约束 .
如何在求解中计算此约束?
谢谢 !
1 回答
当您用
sum(g in max(1,h-p[j]+1)..h)
替换sum(g in max(0,h-p[j]+1)..h)
时,请检查是否仍然出现"cannot extract expression"错误,因为在您的数学公式中,总和索引会受到>0
限制 .