我正在研究使用CPLEX的列生成算法来解决精简主问题。
在将新变量添加到RMP之后,我将其上限设置为0,再次求解RMP并检索其降低的成本(以检查我计算出的值是否与CPLEX提供的值匹配)。
在第一次迭代中,降低的成本是匹配的。
但是,经过几次迭代,我开始获得不同的降低成本。
当我运行CPLEX Interative Optimizer时,读取LP模型(或MPS)并比较约束的对偶,我会得到一些不同的值。
这有意义吗?
我尝试使用不同的方法来解决我的LP。还尝试了更改公差。
问题统计
Objective sense : Minimize
Variables : 453308 [Fix: 8, Box: 453300]
Objective nonzeros : 6545
Linear constraints : 578166 [Less: 70814, Greater: 503886, Equal: 3466]
Nonzeros : 2710194
RHS nonzeros : 7986
Variables : Min LB: 0.0000000 Max UB: 74868.86
Objective nonzeros : Min : 0.01000000 Max : 10000.00
Linear constraints :
Nonzeros : Min : 0.004000000 Max : 396.8800
RHS nonzeros : Min : 0.01250000 Max : 74868.86
显示解决方案质量,我得到以下信息:
Max. unscaled (scaled) bound infeas. = 8.52651e-014 (3.33067e-015)
Max. unscaled (scaled) reduced-cost infeas. = 2.24935e-010 (5.62339e-011)
Max. unscaled (scaled) Ax-b resid. = 5.90461e-011 (3.69038e-012)
Max. unscaled (scaled) c-B'pi resid. = 2.6489e-011 (7.27596e-012)
Max. unscaled (scaled) |x| = 45433 (2839.56)
Max. unscaled (scaled) |slack| = 4970.49 (80.1926)
Max. unscaled (scaled) |pi| = 295000 (206312)
Max. unscaled (scaled) |red-cost| = 411845 (330962)
Condition number of scaled basis = 1.1e+008
答案 0 :(得分:2)
正如欧文(Erwin)评论中提到的那样,您正在经历的可能是简并性。
在比玩具模型更大的问题中,原始和双重解决方案通常都不都是唯一的。
通过将一组原始变量固定为最佳水平,假设解决方案是原始对偶最优,并且解决方案存储在CPLEX中,则在应用修复后,应该进行零次迭代以重新优化模型。因此,它应该返回相同的解决方案。但是,如果CPLEX中没有存储解决方案,而您从头开始进行优化,则CPLEX可能会返回不同的(但也是最佳的)(主要和/或双重)解决方案。
您在日志中看到迭代了吗?
作为调试,请尝试在修复之前和之后写出模型,然后对这两个文件进行比较以确保您身边没有建模/编程错误。
也欢迎您通过bo.jensen(at)dk(dot)ibm(dot)com与我联系,由于我不会密切关注堆栈溢出,因此我将尽力为您提供帮助。
答案 1 :(得分:1)
我的猜测是,当您设置子问题时,您无法在超出变量上限的情况下考虑变量成本的降低。这些降低的成本本质上是上限约束的对偶值,因此在设置子问题时必须将其考虑在内。
这种意外遗漏通常发生在生成的变量具有上限时。
如果确实是您的问题,那么最简单的解决方案可能就是不为新变量指定上限,如果隐含了上限,则可以这样做(例如,新变量是集团约束的一部分) )。