Skip to main content

Float exponent in Non Linear Programming

Answered

Comments

2 comments

  • Jaromił Najman
    Gurobi Staff Gurobi Staff

    This post is related to Solving a non linear Programming.

    0
  • Zed Dean
    Gurobi Staff Gurobi Staff

    Hello,

    I suggest to add some auxiliaries variables and to do minor reformulation. Please check below the suggested approach. You may run gurobi to maximize Z**2 instead of Z. Squaring the objective function does not change the optimal solution, since the objective function is nonnegative, and the square function is monotonically increasing over the nonnegative real numbers. If you want to optimize for Z you can go for option 2. We are trying to avoid the PWL approximation.

    I suggest that you go through the following  link to understand the proposed approach fully. 

    How do I model multilinear terms in Gurobi? – Gurobi Support Portal

    \begin{array}{l}
    x=a+b-c \\
    y=b+c-a \\
    z=a+c-b \\
    Z=\frac{\sqrt{15}}{2} \times \sqrt{x \cdot y \cdot z} \\
    \omega=y \cdot z \\
    \max Z^{2}=\frac{15}{4} \cdot x \cdot w
    \end{array}

    Option 1:


    # Create a new model
    m = gp.Model("Model")

    Const = 0.5 * (15) ** 0.5
    # Create variables
    x = m.addVar(name="x")
    y = m.addVar(name="y")
    z = m.addVar(name="z")
    w = m.addVar(name="w")
    a = m.addVar(lb=0,name="a")
    b = m.addVar(lb=0,name="b")
    c = m.addVar(lb=0,name="c")

    # Option1: Set objective: maximize Z**2
    m.setObjective((Const ** 2) * x * w, GRB.MAXIMIZE)

    # Add auxiliary constraints
    m.addConstr(x == a + b - c, "x")
    m.addConstr(y == b + c - a, "y")
    m.addConstr(z == a + c - b, "z")
    m.addConstr(w == y * z, "w")

    # Add basic constraints
    m.addConstr(a + b + c <= 60, "c1")
    m.addConstr(a + b >= c, "c2")
    m.addConstr(b + c >= a, "c3")
    m.addConstr(a + c >= b, "c4")

    # Solve
    m.Params.NonConvex = 2
    m.optimize()
    m.printAttr('x')

    Option 2: 


    # Create a new model
    m = gp.Model("Model")
    Const = 0.5 * (15) ** 0.5

    # Create variables
    x = m.addVar(name="x")
    y = m.addVar(name="y")
    z = m.addVar(name="z")
    w = m.addVar(name="w")
    a = m.addVar(lb=0,name="a")
    b = m.addVar(lb=0,name="b")
    c = m.addVar(lb=0,name="c")
    Z = m.addVar(name="Z")
    Z_Square = m.addVar(name="Z_Square")

    # Option2: Set objective: maximize Z
    m.setObjective(Z, GRB.MAXIMIZE)

    # Add auxiliary constraints
    m.addConstr(x == a + b - c, "x")
    m.addConstr(y == b + c - a, "y")
    m.addConstr(z == a + c - b, "z")
    m.addConstr(w == y * z, "w")
    m.addConstr(Z_Square == (Const ** 2) * x * w, "Z_Square")
    m.addConstr(Z**2 == Z_Square, "Z")

    # Add basic constraints
    m.addConstr(a + b + c <= 60, "c1")
    m.addConstr(a + b >= c, "c2")
    m.addConstr(b + c >= a, "c3")
    m.addConstr(a + c >= b, "c4")


    # Solve
    m.Params.NonConvex = 2
    m.optimize()
    m.printAttr('x')






    Best regards,

    Zed

     

    0

Please sign in to leave a comment.