Solving a non linear Programming
Answered
How do I solve this using Gurobi? Kindly reply.
0
-
Official comment
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. -
Hi,
The Model.addGenConstrPow() general constraint API in Gurobi can be used to represent constraints in the form of \(y = x^a\) where \(y\) and \(x\) are instances of Gurobi Var objects and \(a\) is a positive constant. For example, to represent the term \((a+b-c)^{\frac{1}{2}}\), two auxiliary variables \(d\) and \(d_{sr}\) need to be defined to represent \(d = a + b - c \) and \( d_{sr} = d^{\frac{1}{2}}\), respectively.
When using general constraint APIs, it is very important to define the variable bounds as tight as possible. See the code snippet below for an implementation of your model.
import gurobipy as gp
from gurobipy import GRB
from math import sqrt
if __name__ == "__main__":
m = gp.Model("model")
# Define decision variables
a = m.addVar(lb=0, ub=60, vtype=GRB.CONTINUOUS, name="a")
b = m.addVar(lb=0, ub=60, vtype=GRB.CONTINUOUS, name="b")
c = m.addVar(lb=0, ub=60, vtype=GRB.CONTINUOUS, name="c")
# Define auxiliary variables
# d = a + b - c
d = m.addVar(lb=0, ub=60, vtype=GRB.CONTINUOUS, name="d")
# dsr = (a + b - c)**0.5 = d**0.5
d_sr = m.addVar(lb=0, ub=8, vtype=GRB.CONTINUOUS, name="d_sr")
# e = b + c - a
e = m.addVar(lb=0, ub=60, vtype=GRB.CONTINUOUS, name="e")
# e_sr = (b + c - a)**0.5 = e**0.5
e_sr = m.addVar(lb=0, ub=8, vtype=GRB.CONTINUOUS, name="e_sr")
# f = a + c - b
f = m.addVar(lb=0, ub=60, vtype=GRB.CONTINUOUS, name="f")
# f_sr = (a + c - b)**0.5 = f**0.5
f_sr = m.addVar(lb=0, ub=8, vtype=GRB.CONTINUOUS, name="f_sr")
# g = e_sr * f_sr
g = m.addVar(lb=0, ub=64, vtype=GRB.CONTINUOUS, name="g")
# Define the objective
m.setObjective(sqrt(15) * 0.5 * d_sr * g, sense=GRB.MAXIMIZE)
# Define constraints
# d = a + b - c
m.addConstr(d == a + b - c, name="set_d")
# d_sr = d**0.5
m.addGenConstrPow(d, d_sr, 0.5, "set_d_square_root", "FuncPieces=2000")
# e = b + c - a
m.addConstr(e == b + c - a, name="set_e")
# e_sr = e**0.5
m.addGenConstrPow(e, e_sr, 0.5, "set_e_square_root", "FuncPieces=2000")
# f = a + c - b
m.addConstr(f == a + c - b, name="set_f")
# f_sr = f**0.5
m.addGenConstrPow(f, f_sr, 0.5, "set_f_square_root", "FuncPieces=2000")
# g = e_sr * f_sr
m.addQConstr(g == e_sr * f_sr, name="set_g")
# c1: a + b + c <= 60
m.addConstr(a + b + c <= 60, name="c1")
# c2: a + b >= c
m.addConstr(a + b >= c, name="c2")
# c3: b + c >= a
m.addConstr(b + c >= a, name="c3")
# c4: a + c >= b
m.addConstr(a + c >= b, name="c4")
m.params.NonConvex = 2
m.optimize()
m.printAttr("X")Best regards,
Maliheh
0
Post is closed for comments.
Comments
2 comments