很多人第一次在CPLEX里看结果,往往先盯目标值,觉得求出最优就算结束了。可真到了模型调参、业务解释和方案比较阶段,真正有价值的往往不是最优值本身,而是约束的对偶值、变量的reduced cost,以及右端项和目标系数的敏感性范围。IBM官方文档对这件事讲得很清楚,若你解的是LP,并且basis可用,解后还能继续做sensitivity analysis;在Interactive Optimizer里,可以直接用`display solution dual`看约束对偶值,用`display sensitivity objective`和`display sensitivity rhs`看目标系数与右端项的敏感性范围。
一、cplex对偶值怎么查看
先把一个前提讲清楚,对偶值不是所有模型都能直接拿到。IBM官方把敏感性分析明确表述为LP且basis可用时的后处理信息,而在MIP解的信息说明里,Interactive Optimizer列出的重点是最优整数解、best bound、solution quality和primal values,并没有把dual information放进MIP的常规解后信息里。所以实际使用时,先判断自己解的是LP还是MIP,这一步比直接写命令更重要。
1、在Interactive Optimizer里直接看
如果你用的是Interactive Optimizer,最直接的命令就是`display solution dual`。IBM官方命令表里已经把这个命令列出来了,旧版入门教程也明确演示了它的用途,也就是查看每条约束对应的dual price。这个方式最适合先快速浏览哪几条约束真正“顶住了”模型。
2、在API里按约束取
如果你是通过C++、Java或其他API调模型,官方提供了成套方法去取这类解后信息。以IloCplex为例,文档中列出了`getDual`与相关批量接口,也列出了`getSlack`、`getReducedCosts`这些配套方法。真正做分析时,不要只拿dual一个值,最好把dual和slack一起看,因为很多时候你要先分清这条约束是紧的还是松的,再决定这个对偶值值不值得解释。
3、先看哪几条约束是活跃的
对偶值的业务解释,不建议从全表逐行读起。更实用的顺序,是先找slack为0或接近0的约束,再看它们的dual price。因为从线性规划的常规解读上讲,真正起资源约束作用的通常是活跃约束,而不是那些还留着明显松弛量的约束。IBM文档虽然重点在接口和命令,但它同时提供了dual与slack两套查看入口,本身就在暗示这两类信息最好结合起来读。
4、若是MIP先别急着解释对偶值
如果模型是混合整数规划,不要把LP那套dual解释直接套上去。IBM社区里有直接报错示例,调用dual接口会返回“Not available for mixed-integer programs”,而官方文档对sensitivity analysis的表述也始终围绕LP与basis展开。实务里更稳的做法,是先看LP relaxation或固定整数变量后的连续子问题,再讨论shadow price这类解释。
二、cplex如何解读敏感性分析结果
敏感性分析最容易被误读的地方,是把它当成“变量和约束可以随便改动的安全区间”。其实IBM官方的表述很严格,目标系数和右端项的敏感性范围,说的是在不改变当前最优basis的前提下,这些数据能变动到什么范围。因此它更适合回答“在当前最优结构不变时,我还能改多少”,而不是回答“模型永远都不会变”。
1、先看objective sensitivity
在Interactive Optimizer里,对目标系数的敏感性分析可用`display sensitivity objective`来看。官方示例说明,这张表会列出每个变量的reduced cost,以及该变量目标系数的Down、Current和Up。这里的核心不是把区间当普通上下限,而是理解为,当前目标系数在这个区间内变化时,最优basis不变。也就是说,若某个变量的目标系数只允许很窄的浮动区间,说明当前解对这项收益或成本非常敏感。
2、再看rhs sensitivity
右端项敏感性分析可用`display sensitivity rhs`来看。IBM官方示例明确写到,这张表会显示每条约束的dual price,以及RHS的Down、Current和Up。这里最常用的解释方式是,在这个允许区间内,右端项每增加或减少一个单位,目标值大致按dual price的方向和幅度变化。换句话说,这张表最适合拿来回答“多给一点资源值不值”或者“少给一点资源会损失多少”。
3、reduced cost不只是“非基变量信息”
很多人看objective sensitivity时,只看Up和Down,忽略reduced cost。其实官方把reduced cost直接放在目标系数敏感性表里,本身就说明它不是陪衬。对最小化问题来说,某个当前取值为0的变量若reduced cost很大,通常意味着它要想进入基,目标系数得改善很多;反过来,若reduced cost接近0,说明它离“进解”已经不远。这个信息对筛选备选变量和做模型解释很有帮助。
4、范围分析只在当前基附近有效
这一点一定要单独拎出来看。IBM官方对敏感性分析的定义反复强调basis,所以你一旦把参数改出了Up或Down的范围,就不能再沿用当前dual price和reduced cost去做线性解释了。很多人把敏感性结果当成全局稳定性结论,问题就出在这里。区间内是当前最优基的局部解释,区间外就应该重新求解,而不是继续手工外推。
三、看结果时先抓哪些信息更稳
真正做业务解读时,最容易乱的不是信息不够,而是信息太多。更稳的做法,是先抓三条主线,也就是约束值不值钱,变量有没有进入解的潜力,以及当前最优结构稳不稳。IBM官方把dual、reduced cost、RHS sensitivity、objective sensitivity这几类信息分别开放出来,本质上就是为了支持这三类判断。
1、先抓高dual的紧约束
如果某条约束slack很小,同时dual price明显不为0,它通常就是当前方案里最值得解释的资源约束。因为这类约束往往直接决定目标值还能不能继续改善。先把这几条约束找出来,业务汇报会比“把所有约束都讲一遍”更有效。
2、再抓reduced cost接近0的变量
这类变量往往是下一步最值得关注的边界变量。它们现在可能还没进解,但离改变基结构已经不远。做方案比较、备选变量筛查或价格测试时,优先盯这类变量,通常比盯所有零变量更有方向。
3、最后看敏感性区间宽不宽
区间越窄,说明当前最优结构越脆,稍微调一点数据就可能要重算。区间越宽,说明当前basis在附近更稳。这个判断特别适合拿来做参数稳定性说明,因为它比只说“当前解最优”更接近实际决策场景。
总结
cplex对偶值怎么查看,cplex如何解读敏感性分析结果,关键不是记住几个命令,而是先把适用范围和解读边界分清。查看时,LP可以用`display solution dual`看对偶值,用`display sensitivity objective`和`display sensitivity rhs`看目标系数与右端项的敏感性范围;解读时,先盯紧约束的dual,再看变量的reduced cost,最后再判断Up和Down区间到底宽不宽。顺着这条线去看,CPLEX的解后结果就不只是“求完了”,而会真正变成能拿来做业务解释和模型调优的依据。
