Open
Description
Summary
Ran pyomo solve to optimize a model with one set of binary variables, using gurobi. The optimization was fine, but print(results) showed negative 'number of continuous variables'
Steps to reproduce the issue
$ command1 [options]
$ command2 [options]
...
# example.py
import pyomo.environ as pyo
import numpy as np
# Problem data
flow_network = {
"f1": ("s1", "s2"),
"f2": ("s2", "s3"),
"f3": ("s2", "s3"),
"f4": ("s3", "s4"),
}
flow_cost = {"f1": 2, "f2": 7, "f3": 17, "f4": 1}
total_flow = 2
# penalty weights for binary constraints
K2 = 10
K3 = 4
# Model
model = pyo.ConcreteModel(doc="Flow Optimization Problem")
# Sets
model.nodes = pyo.Set(initialize=["s1", "s2", "s3", "s4"], doc="nodes")
model.edges = pyo.Set(initialize=flow_network.keys(), doc="edges")
# Decision Variables
model.f = pyo.Var(
model.edges, domain=pyo.Binary, doc="flow binary decision on each edge"
)
# Parameters
model.fcost = pyo.Param(
model.edges, initialize=flow_cost, doc="cost of flow on each edge", mutable=True
)
# Objective Function (minimize cost)
model.totalcost = pyo.Objective(
expr=sum(model.f[e] * model.fcost[e] for e in model.edges) * total_flow
+ K2 * model.f["f2"]
+ K3 * model.f["f3"],
sense=pyo.minimize,
)
# Constraints
# Disjunction Constraint
def disjunction_rule(model):
return model.f["f2"] + model.f["f3"] == 1
model.disjunction = pyo.Constraint(rule=disjunction_rule, doc="disjunction constraint")
# Flow Conservation Constraints
def flow_conservation_rule(model, node):
inflow = sum(model.f[edge] for edge in model.edges if flow_network[edge][1] == node)
outflow = sum(
model.f[edge] for edge in model.edges if flow_network[edge][0] == node
)
if node == "s1":
return outflow * total_flow == total_flow # source node
elif node == "s4":
return inflow * total_flow == total_flow # sink node
else:
return inflow == outflow # intermediate nodes
model.flow_conservation = pyo.Constraint(
model.nodes, rule=flow_conservation_rule, doc="flow conservation constraints"
)
model.xrd0 = pyo.Constraint(
expr=model.f["f2"] + model.f["f3"] == 1, doc="f2 or f3 constraint"
)
# Solve the model using a solver
solver = pyo.SolverFactory("gurobi", solver_io="python")
results = solver.solve(model, tee=True)
model.pprint()
print(results)
Error Message
$ # Gurobi Optimizer version 11.0.0 build v11.0.0rc2 (linux64 - "Ubuntu 22.04.3 LTS")
CPU model: 13th Gen Intel(R) Core(TM) i7-1365U, instruction set [SSE2|AVX|AVX2]
Thread count: 6 physical cores, 12 logical processors, using up to 12 threads
Optimize a model with 6 rows, 4 columns and 12 nonzeros
Model fingerprint: 0x504aa310
Variable types: 0 continuous, 4 integer (4 binary)
Coefficient statistics:
Matrix range [1e+00, 2e+00]
Objective range [2e+00, 4e+01]
Bounds range [1e+00, 1e+00]
RHS range [1e+00, 2e+00]
Presolve removed 6 rows and 4 columns
Presolve time: 0.00s
Presolve: All rows and columns removed
Explored 0 nodes (0 simplex iterations) in 0.01 seconds (0.00 work units)
Thread count was 1 (of 12 available processors)
Solution count 1: 30
Optimal solution found (tolerance 1.00e-04)
Best objective 3.000000000000e+01, best bound 3.000000000000e+01, gap 0.0000%
Flow Optimization Problem
2 Set Declarations
edges : edges
Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 1 : Any : 4 : {'f1', 'f2', 'f3', 'f4'}
nodes : nodes
Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 1 : Any : 4 : {'s1', 's2', 's3', 's4'}
1 Param Declarations
fcost : cost of flow on each edge
Size=4, Index=edges, Domain=Any, Default=None, Mutable=True
Key : Value
f1 : 2
f2 : 7
f3 : 17
f4 : 1
1 Var Declarations
f : flow binary decision on each edge
Size=4, Index=edges
Key : Lower : Value : Upper : Fixed : Stale : Domain
f1 : 0 : 1.0 : 1 : False : False : Binary
f2 : 0 : 1.0 : 1 : False : False : Binary
f3 : 0 : 0.0 : 1 : False : False : Binary
f4 : 0 : 1.0 : 1 : False : False : Binary
1 Objective Declarations
totalcost : Size=1, Index=None, Active=True
Key : Active : Sense : Expression
None : True : minimize : (fcost[f1]*f[f1] + fcost[f2]*f[f2] + fcost[f3]*f[f3] + fcost[f4]*f[f4])*2 + 10*f[f2] + 4*f[f3]
3 Constraint Declarations
disjunction : disjunction constraint
Size=1, Index=None, Active=True
Key : Lower : Body : Upper : Active
None : 1.0 : f[f2] + f[f3] : 1.0 : True
flow_conservation : flow conservation constraints
Size=4, Index=nodes, Active=True
Key : Lower : Body : Upper : Active
s1 : 2.0 : 2*f[f1] : 2.0 : True
s2 : 0.0 : f[f1] - (f[f2] + f[f3]) : 0.0 : True
s3 : 0.0 : f[f2] + f[f3] - f[f4] : 0.0 : True
s4 : 2.0 : 2*f[f4] : 2.0 : True
xrd0 : f2 or f3 constraint
Size=1, Index=None, Active=True
Key : Lower : Body : Upper : Active
None : 1.0 : f[f2] + f[f3] : 1.0 : True
8 Declarations: nodes edges f fcost totalcost disjunction flow_conservation xrd0
Problem:
- Name: unknown
Lower bound: 30.0
Upper bound: 30.0
Number of objectives: 1
Number of constraints: 6
Number of variables: 4
Number of binary variables: 4
Number of integer variables: 4
Number of continuous variables: -4
Number of nonzeros: 12
Sense: 1
Number of solutions: 1
Solver:
- Name: Gurobi 11.00
Status: ok
Wallclock time: 0.015126943588256836
Termination condition: optimal
Termination message: Model was solved to optimality (subject to tolerances), and an optimal solution is available.
Solution:
- number of solutions: 0
number of solutions displayed: 0
Information on your system
Pyomo version: 6.7.1
Python version: 3.9.18
Operating system: Linux
How Pyomo was installed (PyPI, conda, source): conda
Solver (if applicable): gurobi