我有一个需要解决的优化问题。这是一个二元线性规划问题,因此所有决策变量都等于0或1.我需要将这些决策变量的某些组合加起来为0或2 +,它们不能总和为1. I&#39 ;我正在努力解决如何在PROC OPTMODEL
中完成此任务。
这就是我需要的东西:
con sum_con: x+y+z~=1;
不幸的是,这只会引发语法错误......有没有办法实现这个目标?
答案 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;