Float exponent in Non Linear Programming
AnsweredI have to solve the following NLP. I am solving NLP in Gurobi for the first time, and I am facing some issues.
While solving this, I have used all the things that I am aware of,
import math as M m=gp.Model('LP')
a=m.addVar(vtype=GRB.CONTINUOUS , name='a') b=m.addVar(vtype=GRB.CONTINUOUS , name='b') c=m.addVar(vtype=GRB.CONTINUOUS , name='c') abc1=m.addVar(name= 'abc1') abc2=m.addVar(name= 'abc2') abc3=m.addVar(name= 'abc3') x=a+b-c y=b+c-a z=a+c-b m.addGenConstrPow(x, abc1, 0.5, "gf", "FunPieces=1000") m.addConstr(a+b+c<=60, name = 'c1') m.addConstr(a+b>=c, name = 'c2') m.addConstr(a+c>=b, name = 'c3') m.addConstr(c+b>=a, name = 'c4')
m.setObjective(((M.sqrt(15)/2)*abc1*abc2*abc3), GRB.MAXIMIZE) m.update() m.optimize() m.printAttr('X')
Here I am getting an error saying
'gurobipy.LinExpr' object has no attribute '__cindex__'
Kindly help me in this regard
-
This post is related to Solving a non linear Programming.
0 -
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.
Comments
2 comments