强制CPLEX在最佳LP解决方案中切换基础

时间:2014-09-18 10:14:14

标签: cplex network-flow

我正在使用CPLEX解决传统的网络流问题(使用Java)。它包含约束Ax = b(A是节点 - 弧入射矩阵,x是链路流的决策变量,b是给定的右侧)。我感兴趣的是在一维中减少b的阴影奖。

在非退化问题中,影子价格由约束Ax = b上的双变量给出。但是,我的问题是堕落。因此,一种最佳解决方案可以通过基础变量和非基础变量的几种组合来表达。这些组合中的每一个应具有不同的双变量。

至少有一个双重应该给我一个增加b的影子价格,另一个双重将提供减少b的影子价格。 (根据W.Powell(1989)的观点:“对线性网络的灵敏度结果和降低退化效应的新近似的评论”)

我的问题是:在用CPLEX解决LP并获得第一组对偶之后,如何让CPLEX执行基础和非基础变量的交换,以便我可以获得另一组对偶?

1 个答案:

答案 0 :(得分:2)

以下整个讨论涉及双重问题。

零成本降低的非基本变量可以在正水平上输入基础并形成替代的最优解。因此,如果问题的最佳目标值是z *并且c' x是关联的目标函数,则可以添加约束 c'x = z*,将目标函数更改为另一个,让simplex执行一次迭代,然后迭代。第二个之后的每次迭代应该(i)生成新的最优解或(ii)生成已经生成的最优解,在这种情况下我们可以改变目标函数并迭代。

此技术描述为here,并引用了C API函数:

  

对于线性程序,非基本变量的成本降低为零   表明存在另一种最佳基础。此外,你可以使用   例程CPXgetgrad和CPXgetx判断是否   关联的枢轴是退化的(在这种情况下,解决方案值   保持不变但基础发生变化)与否(在这种情况下两者都是   解决方案价值和基础变化)。注意降低成本   松弛变量是相关双变量的负数。在   另外,例程CPXaddrows提供了一种简单的枚举方法   替代最优解。假设最优客观价值   原始问题是z *,而c' x是相关目标   功能。使用CPXaddrows添加以下约束:

     

c' x = z *

     

将目标函数更改为其他目标;设置一个单纯形   迭代限制为1(一)(或者在a的情况下解决方案限制为1)   MIP);然后反复优化问题。每个可行的解决方案   这个修改过的问题是原始问题的最佳解决方案。   该程序将提供一些(但不一定是全部)替代方案   原始问题的最佳解决方案。注意这种方法   添加约束也适用于带有a的连续模型   二次目标,而固定非基本变量的方法   零降低成本不容易扩展到非线性   目标。由于CPLEX解决凸二次规划,所以   对二次目标的约束必须是不等式   而不是平等,如线性目标的情况所述   以上。因为只有非基本变量的成本降低为0(零)   当应用程序从一个备用最佳状态移动时,可以更改   对另一个解决方案,你也可以枚举备用最优   解决方案通过使用例程CPXgetdj和CPXgetpi来识别   非基本结构变量和非零成本减少的松弛。   然后,使用将这些结构变量固定为其当前值   CPXchgbds,并使用CPXchgsense修复松弛变量。设置   单纯形迭代次数限制为1(一);像以前一样改变目标;   你可以列举一些但不是全部的替代最优解决方案。

另一种非常相似的方法是向相关的目标函数系数添加一个小的随机向量(即"扰动"目标),解决问题并验证新顶点是否相同作为旧顶点并且它给出与旧顶点相同的目标函数值(如果不是,则再次扰动并重复)。 this post Paul Rubin {/ 3}}很好地描述了这种技术。

对于MIP问题,CPLEX提供了一个解决方案池,可以保留已找到的特定数量的解决方案,以及函数populate,它可以搜索更多解决方案。 This post(再次由Paul Rubin解释)如何在Java API下工作。

<强>更新

跟进以下评论:

  1. 即使有其他解决方案,我也需要我的最佳解决方案才能保持稳定。我只想在堕落的情况下改变基础。
  2. 目标函数值将保持不变,因为我们添加了目标应该等于其最佳值(c'x = z*)的约束。当我说&#34;生成一个新的最佳解决方案&#34;在上文中,我指的是一组新的最佳双值,即不同的最优双基。原始解决方案将保持不变(假设原始问题是简并且原始数据没有多个最优解)。

    1. 更改基础后,我想重新评估双变量。如果我添加c&#39; x = z *作为约束,它会将我的所有对偶设置为0。
    2. 所有双重等于零的事实听起来像是一个实现问题。您是否检查了生成的LP是否可行并且返回了有限的最优解?另外,我不确定我是否理解上述陈述的第一部分(在更改...变量之后)。根据定义,改变(双重)基础是对双重变量的重新评估。当问题是原始退化时(当前情况),存在多个双最优解,因此双空间中的基础的变化导致相同的最优解值并且在相同的原始中基础(除非问题同时具有原始和双重退化)。

      1. 我想避免解决,因为这是我首先要避免的:我可以通过解决我的问题来直接计算影子价格b。
      2. 这是事实,但在这种情况下,我们需要解决问题2 * n次,其中n的大小为b:我们需要替换{{1}的每个组件只有bb - 1一次解决。

        我不知道任何方法可以做你想要的而不解决.. 我找到了一个relevant post by Tobias Achterberg,它是CPLEX的主要开发人员,他基本上描述了相同的方法。此外,this paper通过再次解析LP,从最佳双解决方案中恢复最佳原始解。如果您利用问题的网络流结构,可能无法解决,但这需要为该特定问题构建自定义算法。几年前我曾经为很多尺寸的配方做过类似的事情,而且需要付出一些努力。

        我希望这有帮助!