【问题标题】:Not Equals Constraint in PROC OPTMODEL不等于 PROC OPTMODEL 中的约束
【发布时间】:2014-09-04 12:11:08
【问题描述】:

我有一个优化问题需要解决。这是一个二元线性规划问题,因此所有决策变量都等于 0 或 1。我需要这些决策变量的某些组合加起来为 0 或 2+,它们不能总和为 1。我正在努力解决在PROC OPTMODEL 中完成此操作。

我需要这样的东西:

con sum_con: x+y+z~=1;

不幸的是,这只会引发语法错误...有什么办法可以做到这一点吗?

【问题讨论】:

    标签: sas


    【解决方案1】:

    有关线性重新表述,请参见下文。但是,您可能不需要它。在 SAS 9.4m2 (SAS/OR 13.2) 中,您的表达式按书面形式工作。您只需要调用(实验性)CLP 求解器:

    proc optmodel;
    /* In SAS/OR 13.2 you can use your code directly.
       Just invoke the experimental CLP solver */
        var x binary, y binary, z binary;
        con sum_con: x+y+z~=1;
        solve with clp / findall;
        print {i in 1 .. _NSOL_} x.sol[i] 
              {i in 1 .. _NSOL_} y.sol[i]
              {i in 1 .. _NSOL_} z.sol[i];
    

    立即产生:

    [1] x.SOL y.SOL z.SOL 
      1     0     0     0 
      2     0     1     1 
      3     1     0     1 
      4     1     1     0 
      5     1     1     1 
    

    在旧版本的 SAS/OR 中,您仍然可以直接调用 PROC CLP, 这不是实验性的。 您的示例的语法与 PROC OPTMODEL 的语法非常相似。

    不过,我确信您的模型还有其他变量和约束。 在这种情况下,请记住,无论您如何表述, 它仍然是一个中间有一个洞的搜索空间。 因此,它可能会使求解器表现不佳。 有多差很难预测。这取决于模型的其他功能。

    如果 MILP 更适合您的模型的其余部分, 您可以分两步将您的约束重新表述为有效的 MILP。 首先,添加一个仅在表达式为零时才为零的二进制变量:

    /* If solve with CLP is not available, you can linearize the disjunction: */
    var IsGTZero binary; /* 1 if any variable in the expression is 1 */
    con IsGTZeroBoundsExpression: 3 * IsGTZero >= x + y + z;
    

    然后添加另一个约束,强制表达式为 当它非零时,至少是你想要的常数(在本例中为 2)。

    num atLeast init 2;
    con ZeroOrAtLeast: x + y + z >= atLeast * IsGTZero;
    min f=0; /* Explicit objectives are unnecessary in 13.2 */
    solve;
    

    【讨论】:

    • 感谢您的信息!不幸的是,我有 SAS/OR 13.1,所以 CLP 求解器无法工作。但是,我已经决定使用几天前您建议的第二种解决方案。我真的不想那么激烈......但是,嘿,它有效。
    【解决方案2】:

    以下等式应该有效:

    (x+y-z)*z + (y+z-x)*x + (x+z-y)*y > -1
    

    它可以推广到三个以上的变量,如果你有一些很大的数字,你应该能够使用索引扩展来使它更容易。

    【讨论】:

    • 令人着迷......与我最终采用的解决方案非常不同,但这是我自己永远不会想出的一些数学魔法......
    猜你喜欢
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    相关资源
    最近更新 更多