Solving a non linear Programming
回答済み
How do I solve this using Gurobi? Kindly reply.
0
-
正式なコメント
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
投稿コメントは受け付けていません。
コメント
2件のコメント