How do I insert the objective function with absolute value in Gurobi using Java language?

211 views Asked by At

My objective function is like min|XyPiy-XkPik| i=1...10, j=1...4, k=5...8

I tried to write the code like this, but I don't know what to do with the module

GRBLinExpr obj = new GRBLinExpr();
for(int y=1; y<=4; y++) {
        for(int i=0; i<10; i++) {
            obj.addTerm(pij[i][y], xij[i][y]);
        }
    }
    for(int k=5; k<=8; k++) {
        for(int i=0; i<10; i++) {
            obj.addTerm(-pij[i][k], xij[i][k]);
        }
    }
    model.setObjective(obj);
    model.set(GRB.IntAttr.ModelSense, GRB.MINIMIZE);

It's one of my first exercises and I don't know how to do it, I hope someone can help me

1

There are 1 answers

1
mattmilten On

You need to add an auxiliary variable that takes the value of the objective term. Then, you can define a new general constraint for the absolute value of this auxiliary variable: GRBModel.addGenConstrAbs

The resultant of this constraint (which is yet another auxiliary variable) can then be put into the objective function to be minimized.

GRBVar objvar = model.addVar(-GRB.INFINITY, GRB.INFINITY, 0.0, GRB.CONTINUOUS);
GRBVar absobj = model.addVar(0.0, GRB.INFINITY, 1.0, GRB.CONTINUOUS);
GRBLinExpr obj = new GRBLinExpr();

for(int y=1; y<=4; y++) {
    for(int i=0; i<10; i++) {
        obj.addTerm(pij[i][y], xij[i][y]);
    }
}
for(int k=5; k<=8; k++) {
    for(int i=0; i<10; i++) {
        obj.addTerm(-pij[i][k], xij[i][k]);
    }
}

model.addConstr(objvar, GRB.EQUAL, obj, "obj constraint");
model.addGenConstrAbs(absobj, objvar, "abs obj");

Here, you don't even need to set the objective anymore, because the only objective coefficient is already defined when adding variable absobj (the third argument).