Skip to main content

Abs Value

Answered

Comments

11 comments

  • Juan Orozco
    Gurobi Staff 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 gp
    from gurobipy import GRB

    model = 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.

    0
  • Cris
    Gurobi-versary
    Curious
    Conversationalist

    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.

    1
  • Eli Towle
    Gurobi Staff 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.

    0
  • Cris
    Gurobi-versary
    Curious
    Conversationalist

    Thanks Eli. I will keep this on mind. 

    Best regards

    0
  • carlos saenz
    First Comment

    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()

    "

    0
  • Riley Clement
    Gurobi Staff Gurobi Staff

    Hi Carlos,

    Please reread Eli's answer above.

    - Riley

    0
  • Vivek Tanjavooru
    Gurobi-versary
    First Comment

    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

     

     

     

     

    0
  • Eli Towle
    Gurobi Staff Gurobi Staff

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

    0
  • Vivek Tanjavooru
    Gurobi-versary
    First Comment

    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
    0
  • Eli Towle
    Gurobi Staff 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"
    )
    0
  • Vivek Tanjavooru
    Gurobi-versary
    First Comment

    Hi Eli,

    Thanks a lot for your help, it worked.

    Best regards,

    Vivek

    0

Please sign in to leave a comment.