Skip to main content

Model a binary variable from two continous variables

Answered

Comments

7 comments

  • Official comment
    Simranjit Kaur
    • Gurobi Staff
    This post is more than three years old. Some information may not be up to date. For current information, please check the Gurobi Documentation or Knowledge Base. If you need more help, please create a new post in the community forum, or try Gurobot, our chatbot interface offering instant, expert-level support.
  • Jaromił Najman
    • Gurobi Staff

    Your 3 conditions can be reformulated as

    v_in > 0 => b=1 and b=0 else.

    This is only if you are OK with the fact that if v_in > 0 & v_out > 0 then b=1.

    Modeling such a conditional statement is discussed in the Knowledge Base article How do I model conditional statements in Gurobi?

    0
  • Farhad Anvari Azar
    • Gurobi-versary
    • First Comment
    • First Question

    Thanks Jaromil,

    v_in>0 and v_out>0 should not be possible. Only one of these values can be positive.

    0
  • Jaromił Najman
    • Gurobi Staff

    If v_in>0 and v_out>0 is not possible then your 3 conditions can indeed be formulated as

    v_in > 0 => b=1 and b=0 else and you can follow the instructions in Knowledge Base article How do I model conditional statements in Gurobi?

    0
  • Farhad Anvari Azar
    • Gurobi-versary
    • First Comment
    • First Question

    I read the article and I followed it. I still don't get the correct answer. The issue might arise from other parts of the model. 

    I have prepared the following minimal example. It is a basic storage model built mostly on the power generation example on Gurobi case study.

    Can you please have a look and let me know if you would change it.

    x_vol_init = 0
    x_vol_min = 0
    x_vol_max = 10
    phy_cost = 50
    x_max = 5
    x_max_mirror = -x_max
    n_step = 3

    df = pd.read_csv('input_data.csv', parse_dates=['ts'])

    # Import Constants
    const_out = df['input_out'].values
    const_in = df['input_in'].values

    m = gp.Model('model_1')

    # Define continuous variables
    x_out = m.addVars(n_step, vtype=GRB.CONTINUOUS, ub=x_max)
    x_in = m.addVars(n_step, vtype=GRB.CONTINUOUS, ub=x_max)

    # Define boolean variable
    bln = m.addVars(n_step, vtype=GRB.BINARY)

    # Define other variables
    x_vol = m.addVars(n_step, vtype=GRB.CONTINUOUS, ub=x_vol_max, lb=x_vol_min)
    x_net = m.addVars(n_step, vtype=GRB.CONTINUOUS, ub=x_max, lb=x_max_mirror)

    # From https://support.gurobi.com/hc/en-us/articles/4414392016529-How-do-
    I-model-conditional-statements-in-Gurobi-

    eps = 0.00001
    m.addConstrs(x_out[t] >= x_in[t] + eps - x_max * (1 - bln[t]) for t in range(n_step))
    m.addConstrs(x_out[t] <= x_in[t] + x_max * bln[t] for t in range(n_step))

    # Other constraints
    m.addConstrs(x_net[t] <= x_max for t in range(n_step))
    m.addConstrs(x_net[t] >= x_max_mirror for t in range(n_step))
    m.addConstrs(x_net[t] == x_out[t] - x_in[t] for t in range(n_step))

    # Volume related constraints
    m.addConstrs(x_vol[t] <= x_vol_max for t in range(n_step))
    m.addConstrs(x_vol[t] >= x_vol_min for t in range(n_step))

    m.addConstrs(x_vol[0] == x_vol_init + x_in[0] - x_out[0])
    m.addConstrs(x_vol[t] == x_vol[t - 1] + x_in[t] - x_out[t] for t in range(1, n_step))

    # Calculate the objective fucntion
    OF = gp.quicksum(
    (x_out[t] * const_out[t]) - (x_in[t] * const_in[t]) - (bln[t] * (x_net[t] * phy_cost)) for t in range(n_step)
    )
    m.setObjective(OF, GRB.MAXIMIZE)
    m.optimize()
    0
  • Jaromił Najman
    • Gurobi Staff

    It is not possible to reproduce your example due to missing input_data.csv file. You could try hard coding a small data set which still shows the wrong behavior. Please then also elaborate on what exactly is going wrong with the model and what you would expect to happen.

    0
  • Farhad Anvari Azar
    • Gurobi-versary
    • First Comment
    • First Question

    I found the issue. It has to do with including another continous variable in the objective function (x_net) which results in forcing incorrect values on b_in and b_out.

    Thanks for your support Jaromil.

    Best,

     

    0

Post is closed for comments.