在PROC中不等于约束OPTMODEL

问题描述:

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

像这样的东西是什么,我需要:

con sum_con: x+y+z~=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; 
+0

感谢您的信息!不幸的是,我有SAS/OR 13.1,所以CLP解算器无法工作。但是,我已经决定使用前几天提出的第二种解决方案。我真的不想那么激烈......但是,嘿,它有效。 – 2014-09-08 12:42:26

+0

不客气!我很高兴它是有帮助的。 – Leo 2014-09-08 18:15:34

下面的公式应该工作:

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

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

+0

迷人......从我结束了去解决很大的不同,但是这是一些数学魔法我决不会拿出我自己... – 2014-09-05 12:01:00