在PROC OPTMODEL中不等于约束

时间:2014-09-04 12:11:09

标签: sas

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

这就是我需要的东西:

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

不幸的是,这只会引发语法错误......有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:2)

以下等式应该有效:

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

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

答案 1 :(得分:2)

见下文的线性重构。但是,您可能不需要它。在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;