我有一個需要解決的優化問題。這是一個二元線性規劃問題,所以所有的決策變量都等於0或1.我需要這些決策變量的某些組合加起來爲0或2+,它們不能總和爲1。在PROC OPTMODEL
中完成此操作。在PROC中不等於約束OPTMODEL
像這樣的東西是什麼,我需要:
con sum_con: x+y+z~=1;
不幸的是,這只是拋出一個語法錯誤......有沒有辦法做到這一點?
我有一個需要解決的優化問題。這是一個二元線性規劃問題,所以所有的決策變量都等於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;
下面的公式應該工作:
(x+y-z)*z + (y+z-x)*x + (x+z-y)*y > -1
它可以推廣到三個以上的變量,如果你有一些大量的,你應該能夠使用索引擴展,使其更容易。
迷人......從我結束了去解決很大的不同,但是這是一些數學魔法我決不會拿出我自己... – 2014-09-05 12:01:00
感謝您的信息!不幸的是,我有SAS/OR 13.1,所以CLP解算器無法工作。但是,我已經決定使用前幾天提出的第二種解決方案。我真的不想那麼激烈......但是,嘿,它有效。 – 2014-09-08 12:42:26
不客氣!我很高興它是有幫助的。 – Leo 2014-09-08 18:15:34