2014-09-04 73 views
1

我有一個需要解決的優化問題。這是一個二元線性規劃問題,所以所有的決策變量都等於0或1.我需要這些決策變量的某些組合加起來爲0或2+,它們不能總和爲1。在PROC OPTMODEL中完成此操作。在PROC中不等於約束OPTMODEL

像這樣的東西是什麼,我需要:

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

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

+0

不客氣!我很高興它是有幫助的。 – Leo 2014-09-08 18:15:34

2

下面的公式應該工作:

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

它可以推廣到三個以上的變量,如果你有一些大量的,你應該能夠使用索引擴展,使其更容易。

+0

迷人......從我結束了去解決很大的不同,但是這是一些數學魔法我決不會拿出我自己... – 2014-09-05 12:01:00