【发布时间】:2014-09-04 12:11:08
【问题描述】:
我有一个优化问题需要解决。这是一个二元线性规划问题,因此所有决策变量都等于 0 或 1。我需要这些决策变量的某些组合加起来为 0 或 2+,它们不能总和为 1。我正在努力解决在PROC OPTMODEL 中完成此操作。
我需要这样的东西:
con sum_con: x+y+z~=1;
不幸的是,这只会引发语法错误...有什么办法可以做到这一点吗?
【问题讨论】:
标签: sas
我有一个优化问题需要解决。这是一个二元线性规划问题,因此所有决策变量都等于 0 或 1。我需要这些决策变量的某些组合加起来为 0 或 2+,它们不能总和为 1。我正在努力解决在PROC OPTMODEL 中完成此操作。
我需要这样的东西:
con sum_con: x+y+z~=1;
不幸的是,这只会引发语法错误...有什么办法可以做到这一点吗?
【问题讨论】:
标签: sas
有关线性重新表述,请参见下文。但是,您可能不需要它。在 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;
【讨论】:
以下等式应该有效:
(x+y-z)*z + (y+z-x)*x + (x+z-y)*y > -1
它可以推广到三个以上的变量,如果你有一些很大的数字,你应该能够使用索引扩展来使它更容易。
【讨论】: