gurobipy.Model has no attribute addGenConstrPWL [solved]
AnsweredI'm trying to add piecewise-linear constraints to my model 'RK'.
First, I define the following variables:
for i in range(0, len(Cities)):
DistanceToClosestDC[i] = RK.addVar(vtype=GRB.CONTINUOUS, name="DistanceToClosestDC"+str(i))
WeightCoefficients[i] = RK.addVar(vtype=GRB.CONTINUOUS, name="WeightCoefficients"+str(i))
The following piecewise-linear constraints are added:
for i in range(0, len(Cities)):
RK.addGenConstrPWL(DistanceToClosestDC[i], WeightCoefficients[i], [0, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5, 21.5, 22.5, 23.5, 24.5, 25, 26], [1, 0.979995816,0.855306584,0.746482118,0.651503874,0.568610134,0.496263335,0.43312154,0.378013558,0.329917209,0.287940374,0.251304437,0.219329855,0.19142354,0.167067871,0.145811082,0.127258888,0.111067173,0.096935602,0.084602054,0.073837758,0.064443051,0.056243675,0,0], "c8"+str(i))
The values assigned to the 'DistanceToClosestDC' variables are determined by other constraints. This process has been checked and works fine.
The goal is to determine the values of the 'WeightCoefficients' variables by these piecewise-linear constraints. However, I get the following error:
AttributeError: 'gurobipy.Model' object has no attribute 'addGenConstrPWL'
As a double check: Gurobi version 9.1.1 is installed and my (academic) license has been updated after the installation. I am using Python version 3.6.
Can anyone tell me what I am doing wrong? Thanks!
-
Hi Rune,
Could you post a minimal working example to make the issue reproducible? In particular, could you please post your \(\texttt{import}\) statements?
Best regards,
Jaromił0 -
Dear Jaromił
The following code should reproduce the issue with a small example. I included all the import statements I need in the complete code, even though they are not used in this example.
import pandas as pd
from gurobipy import *
import numpy as np
import math
#inputs
Cities = ['ab', 'bc', 'cd', 'de', 'ef']
Citizens = [1000, 2000, 800, 1500, 350]
Distances = [[0, 18, 20, 5, 37], [27, 0, 3, 19, 26], [16, 2, 0, 39, 24], [22, 4, 15, 0, 17], [36, 14, 7, 8, 0]]
#variables
DistanceToClosestDC = {}
WeightCoefficients = {}
DC = {}
DistanceHelpDC = {}
RK = Model("RK")
# Create variables
for i in range(0, len(Cities)):
DC[i] = RK.addVar(vtype=GRB.BINARY, name="DC"+str(i))
DistanceToClosestDC[i] = RK.addVar(vtype=GRB.CONTINUOUS, name="DistanceToClosestDC"+str(i))
WeightCoefficients[i] = RK.addVar(vtype=GRB.CONTINUOUS, name="WeightCoefficients"+str(i))
for j in range(0, len(Cities)):
DistanceHelpDC[i,j] = RK.addVar(vtype=GRB.CONTINUOUS, name="DistanceHelpDC"+str(i)+"."+str(j))
# Set objective
RK.setObjective(quicksum(DC[i]*Citizens[i] + (1-DC[i])*WeightCoefficients[i]*Citizens[i] for i in range(0, len(Cities))), GRB.MAXIMIZE)
# Constraints
RK.addConstr(quicksum(DC[i] for i in range(0, len(Cities))) == 1, "c1")
for i in range(0, len(Cities)):
for j in range(0, len(Cities)):
RK.addConstr(DistanceHelpDC[i,j] == (1-DC[j])*1000 + DC[j]*Distances[i][j], "c2."+str(i)+"."+str(j))
RK.addGenConstrMin(DistanceToClosestDC[i], [DistanceHelpDC[i,j] for j in range(0,len(Cities))], 1000, "c3."+str(i))
RK.addGenConstrPWL(DistanceToClosestDC[i], WeightCoefficients[i], [0, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5, 21.5, 22.5, 23.5, 24.5, 25, 26], [1, 0.979995816,0.855306584,0.746482118,0.651503874,0.568610134,0.496263335,0.43312154,0.378013558,0.329917209,0.287940374,0.251304437,0.219329855,0.19142354,0.167067871,0.145811082,0.127258888,0.111067173,0.096935602,0.084602054,0.073837758,0.064443051,0.056243675,0,0], "c4."+str(i))
# Optimize model
RK.optimize()Thank you in advance. Let me know if this suffices.
Kind regards,
Rune
0 -
Hi Rune,
When I execute your Python code, I don't get any error. The output is:
Gurobi Optimizer version 9.1.1 build v9.1.1rc0 (mac64)
Thread count: 4 physical cores, 8 logical processors, using up to 8 threads
Optimize a model with 26 rows, 40 columns and 55 nonzeros
Model fingerprint: 0x7cd2e8c9
Model has 5 quadratic objective terms
Model has 10 general constraints
Variable types: 35 continuous, 5 integer (5 binary)
Coefficient statistics:
Matrix range [1e+00, 1e+03]
Objective range [4e+02, 2e+03]
QObjective range [7e+02, 4e+03]
Bounds range [1e+00, 1e+00]
RHS range [1e+00, 1e+03]
Presolve added 0 rows and 100 columns
Presolve time: 0.01s
Presolved: 31 rows, 145 columns, 440 nonzeros
Presolved model has 5 SOS constraint(s)
Variable types: 140 continuous, 5 integer (5 binary)
Root relaxation: objective 5.650000e+03, 23 iterations, 0.00 seconds
Nodes | Current Node | Objective Bounds | Work
Expl Unexpl | Obj Depth IntInf | Incumbent BestBd Gap | It/Node Time
0 0 5650.00000 0 10 - 5650.00000 - - 0s
H 0 0 4386.2280163 5650.00000 28.8% - 0s
0 0 5514.11595 0 8 4386.22802 5514.11595 25.7% - 0s
Cutting planes:
Implied bound: 7
MIR: 7
Flow cover: 4
Inf proof: 1
RLT: 2
Relax-and-lift: 13
Explored 1 nodes (69 simplex iterations) in 0.04 seconds
Thread count was 8 (of 8 available processors)
Solution count 1: 4386.23
Optimal solution found (tolerance 1.00e-04)
Best objective 4.386228016271e+03, best bound 4.386228016271e+03, gap 0.0000%How did you install Gurobi? What is your operating system? Are you using any specific setup on your machine?
Best regards,
Jaromił0 -
Dear Jaromił
I installed Gurobi via the Download Center of Gurobi (https://www.gurobi.com/downloads/). This should have worked, as I get the following results on the command-line tool:
I'm using Windows 10 on my laptop.
More details (since I have no clue what the problem could be):
* I have an academic license that might not allow me to use all Gurobi tools?
* I code in the Spyder environment (version 4.1.5) with Python version 3.6.9
Kind regards,
Rune
0 -
Dear Rune,
The academic license provides you access to all features of the Gurobi package. The code also works in a Spyder environment. Could you post the whole error output for the code snippet you provided?
Could you also try printing the Gurobi version used by Spyder via
print(gurobi.version())
Best regards,
Jaromił0 -
Dear Jaromił
The Gurobi version used was Gurobi 9.1.1.
I re-installed Anaconda and Gurobi and now it seems to work. I still have no idea why it didn't work before.
Thanks for your responses. It showed me that the error was not in the code but in the installation.
Kind regards,
Rune
0
Please sign in to leave a comment.
Comments
6 comments