2017-05-08 296 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(...),它会将这个变量添加到目标函数中。我对么? –