MIP模型中求矩阵列最大值报错的修复方案咨询
问题修复与MIP模型实现
报错原因
你遇到的Error 59和Error 256根源在于:smax属于非线性表达式,而MIP(混合整数规划)模型要求所有约束必须是线性的,无法直接支持这类非线性操作符。
修复方案
要在MIP中实现“求解矩阵各列最大值存入last(i)”的需求,需要通过线性化约束替代非线性的smax操作,具体步骤如下:
1. 变量定义调整
确保last(i)为连续变量(若EM是整数变量,也可定义为整数变量),同时引入二进制辅助变量标记取到最大值的位置:
Variables EM(f,t,i) '正决策变量' last(i) '各列最大值'; Positive Variables EM; Binary Variables delta(f,t,i) '辅助二进制变量,标记对应EM(f,t,i)是否为列最大值';
2. 线性化约束实现最大值逻辑
用两组线性约束替代原有的eq2:
- 下限约束:保证
last(i)不小于当前列的所有EM(f,t,i)值eq2_lower(f,t,i).. last(i) =g= EM(f,t,i); - 上限约束+二进制变量约束:保证
last(i)等于当前列的某个EM(f,t,i)值(即最大值)
首先定义一个足够大的常数M(需大于EM可能的最大取值,示例中取10即可):
然后添加约束:Scalar M /10/;
其中eq2_upper(f,t,i).. last(i) =l= EM(f,t,i) + M*(1 - delta(f,t,i)); eq2_delta(i).. sum(f,t, delta(f,t,i)) =e= 1;eq2_delta确保每个列i下有且仅有一个delta变量取1,标记该位置的EM为列最大值。
特殊情况:若EM是已知参数
如果EM是已知的固定参数而非决策变量,无需构建MIP模型,直接通过参数计算即可:
Parameters EM(f,t,i) '给定的EM取值' last(i) '各列最大值'; * 初始化EM参数(你的示例数据) EM('f1','t1','i1') =7; EM('f1','t1','i2')=5; EM('f1','t1','i3')=6; EM('f1','t1','i4')=0; EM('f1','t1','i5')=6; EM('f1','t2','i1') =8; EM('f1','t2','i2')=4; EM('f1','t2','i3')=6; EM('f1','t2','i4')=1; EM('f1','t2','i5')=6; EM('f1','t3','i1') =6; EM('f1','t3','i2')=7; EM('f1','t3','i3')=3; EM('f1','t3','i4')=2; EM('f1','t3','i5')=4; EM('f2','t1','i1') =8; EM('f2','t1','i2')=7; EM('f2','t1','i3')=5; EM('f2','t1','i4')=3; EM('f2','t1','i5')=1; EM('f2','t2','i1') =0; EM('f2','t2','i2')=5; EM('f2','t2','i3')=5; EM('f2','t2','i4')=7; EM('f2','t2','i5')=0; EM('f2','t3','i1') =0; EM('f2','t3','i2')=8; EM('f2','t3','i3')=0; EM('f2','t3','i4')=5; EM('f2','t3','i5')=9; * 直接计算各列最大值 last(i) = smax((f,t), EM(f,t,i));
结果验证
无论采用哪种方式,最终都会得到你需要的结果:last('i1')=8, last('i2')=8, last('i3')=6, last('i4')=7, last('i5')=9
内容的提问来源于stack exchange,提问作者Kosovi
相关产品推荐
相关产品推荐

