2017-05-08 64 views
0

通常在Gurobi的Java接口I通過增加變量模型與此例如創建模型:使用決策變量Gurobi的Java

for (int i = 0; i < n; i++){ 
    for (int j = 0; j < n; j++) { 
     XobjectiveCoef = distance(i, j); 
     X[i][j] = model.addVar(0.0, 1.0, XobjectiveCoef, GRB.BINARY, "x" + String.valueOf(i) + "_" + String.valueOf(j)); 

    } 
} 

當我做我有我的模型,該模型的總和以上的所有X i和j,我可以在任何約束使用X[i][j]我想是這樣的:

for (int j = 0; j < n; j++) { 
    GRBLinExpr expr = new GRBLinExpr(); 
    for (int i = 0; i < n; i++){ 
     expr.addTerm(1.0, X[i][j]); 
    } 
    model.addConstr(expr, GRB.EQUAL, 1.0, "Name_of_constraint"); 
} 

現在我找的,是使用決策變量只有在一個約束,並非上策在模型定義中。我檢查了是否addVar可用於GRBLinExpr但它不是。

感謝

回答

0

您可以創建一個GRBLinExpr和重用。例如:

model.addConstr(expr, GRB.EQUAL, 1.0, "ct1"); 
expr.addTerm(1.0, Y); 
expr.addTerm(1.0, Z). 
model.addConstr(expr, GRB.GREATER_EQUAL, 2.0, "ct2"); 

這可能是或可能不是不是創建一個新對象GRBVar更有效。

+0

感謝您的回答。我知道我可以重用expr,但我不確定我能否得到答案。在哪裏以及如何創建Y和Z(如果它們不在模型定義中)(因此不是使用model.addVar(...)創建的)? –

+0

Y和Z是新變量;該示例僅表明您可以重用名爲expr的GRBLinExpr。 –

+0

謝謝你的例子。但是從主要問題和評論中可以看出,問題不在於重複使用表達式,問題在於創建決策變量而不將其添加到目標函數中。構造函數new GRBVar不可用,您必須通過model.addVar(...)。但是如果我調用model.addVar(...),它會將這個變量添加到目標函數中。我對麼? –