• Gurobi Staff

Did you load the package guobipy into your script? Also, if you did import the package using the standard import gurobipy as gp, make sure you use gp.abs_() instead of just abs_().

To illustrate how to deal with absolute values using general constraints, I'll use the optimization model shown in this stackoverflow question:

import gurobipy as gpfrom gurobipy import GRBmodel = gp.Model("myModel")v1 = model.addVar(vtype=GRB.INTEGER, name="v1")v2 = model.addVar(vtype=GRB.INTEGER, name="v2")v3 = model.addVar(vtype=GRB.INTEGER, name="v3")diff1 = model.addVar(vtype=GRB.CONTINUOUS, name="diff1")diff2 = model.addVar(vtype=GRB.CONTINUOUS, name="diff2")abs1 = model.addVar(lb=0, vtype=GRB.CONTINUOUS, name="abs1")abs2 = model.addVar(lb=0, vtype=GRB.CONTINUOUS, name="abs2")model.addConstr(3*v1 + v2 + v3 <= 72, name="constr1")model.addConstr(2*v1 + 3*v2 + 2*v3 <= 80, name="constr2")model.addConstr(diff1 == v1 - v2, name="diffConstr1")model.addConstr(diff2 == v2 - v3, name="diffConstr2")model.addGenConstrAbs(abs1, diff1, "absConstr1")model.addGenConstrAbs(abs2, diff2, "absConstr1")model.addConstr(abs1 + abs2 >= 10, name="constr3")model.setObjective(v1 + v2 + v3, GRB.MAXIMIZE)model.optimize()

After optimizing this model, Gurobi should output v_1 = 18; v_2 = 9; v_3 = 8, with constr3 as binding constraint.

Hi Juan, I suppose you talk spanish if you want to keep talking. I was trying to do the next thing.

y = model.addVars(Amigos, vtype= GRB.CONTINUOUS, lb= -GRB.INFINITY, ub=GRB.INFINITY, name = "y")

model.update()

model.addConstr(quicksum(abs_(y[a]) for a in Amigos) <= rho)

It does not work, so I had to do the following code. I created an auxiliar var called y_abs

from gorobipy import GRB, quicksum, Model, abs_ model = Model()y = model.addVars(Amigos,vtype=GRB.CONTINUOUS,lb= -GRB.INFINITY, ub= GRB.INFINITY, name="y")y_abs = model.addVars(Amigos,vtype=GRB.CONTINUOUS, name="y_abs")model.update()for a in Amigos:    model.addConstr(y_abs[a] == abs_(y[a]), name="absconstr")model.addConstr(quicksum(y_abs[a] for a in Amigos) <= rho)......

I would like to know what is the problem with the first option and why doesn work.

Best regards and thanks for your answer

Cristian.

• Gurobi Staff

The abs_() function can only be used to set one decision variable equal to the absolute value of another. E.g.:

model.addConstr(y == abs_(x), name='abs_x')

You unfortunately can't use abs_() in any other type of constraint, like you try to do in the first example. Creating auxiliary variables is the right way to model this.

Thanks Eli. I will keep this on mind.

Best regards

Hi Gurobi team

I have alike situation, I´m trying to use the abs value of a variable in the objective function. but in the restrictions I cannot change the variable because the sign is important there. please help

and thanks in advance

"

#------------------------------------------------------------------------------------------------------------Objective function-----------------------------------------
m1.setObjective( gb.quicksum(Pr* Dn[(t,n)] for t in T for n in N )# Cost of gas supply

+gb.quicksum(nodos_info_[t][k]['precio_oferta']*Ok[(t,k)]for t in T for k in K)
+gb.quicksum(tramos_info_[t][l]["c_trans"] *gb.abs_((fl[(t,l)]))for t in T for l in L)

, gb.GRB.MINIMIZE)

#--------------------------------------------------------------
m1.optimize()

"

• Gurobi Staff

Hi Carlos,

- Riley

Hi Eli,

Hi Riley,

Is it not possible to have multiple constraints with abs_() functions? I am working on a multi objective problem. I want to minimize the absolute values of 3 different decision variables. The abs_() function works for one variable and doesn't do the task for the other 2.

Will you please explain?

Thanks a lot!

- Vivek

• Gurobi Staff

A model can include multiple absolute value constraints. Can you please post a minimal reproducible example that shows the issue?

So these are some of the constraints:

opt_model.addConstrs((energy_bess1[t]/capacity1 - energy_bess2[t]/capacity2 == delta_SOE[t] for t in time), 'deltaSOE')
#Absolute Delta SOE
opt_model.addConstrs((abs_delta[t] == abs_(delta_SOE[t]) for t in time), 'absDelta')

opt_model.addConstrs((energy_heat2[t] - energy_heat1[t] == delta_energy_heat[t] for t in time), 'delta_energy_heat')
opt_model.addConstrs((abs_delta_energy_heat[t] == abs_(delta_energy_heat[t]) for t in time), 'abs_Delta_heatContent')

The abs_(delta_SOE) works as intended but the second absolute function gives an error if the energy_heat1 is bigger than energy_heat2.

Any tips on this?

Thanks,
Vivek
• Gurobi Staff

Without knowing what the error message is, I would guess the variable bounds might be the problem. By default, variables have a lower bound of $$0$$. Did you remove this default lower bound from the $$\texttt{delta_energy_heat}$$ variables when you defined them? E.g.:

delta_energy_heat = opt_model.addVars(    time, lb=-gp.GRB.INFINITY, name="delta_energy_heat")

Hi Eli,

Thanks a lot for your help, it worked.

Best regards,

Vivek