Gurobi's 'compute IIS' feature is designed to address the query: "What subset of model constraints is responsible for making the model infeasible?" In this article, we will show how to use this feature. A related article How do I determine why my model is infeasible? expands on the topic of infeasibility analysis tools further.
The 'compute IIS' feature identifies an irreducible set of conflicting constraints and bounds within a model. Analyzing the entire set of constraints and variable bounds to pinpoint the cause of an infeasible model can be daunting. Gurobi's 'compute IIS' tools can reduce the problem to a possibly much smaller subset of conflicting constraints and limits, making it more manageable to comprehend and analyze.
An Irreducible Infeasible Subsystem (IIS) refers to a specific subset of constraints and variable bounds within an infeasible system. This subset satisfies two essential conditions:
- It is itself infeasible, and
- removing any single constraint or bound from the subset would result in a feasible subsystem.
Notably, an IIS may not be the smallest infeasible subset (concerning cardinality). More specifically, this means that an infeasible model may have multiple IISs, and the one returned by Gurobi might not necessarily be the one with the fewest constraints or bounds. Note that our algorithm favors the recovery of smaller IIS in general.
The 'compute IIS' results are designed to be examined and analyzed by human users, providing a starting point for understanding the problematic constraints in the model. The smaller the IIS, the more effectively it can pinpoint the specific issues in the model.
In terms of computational complexity, calculating an IIS is relatively inexpensive for linear programming (LP) problems but is more computationally expensive for mixed-integer programming (MIP) problems.
Practical Usage Guide
In Python, you can compute an IIS using the Model.computeIIS() method. This can help you narrow down your list of suspicious constraints. After building and then solving the model, you can compute the IIS with the following:
import gurobipy as gp
from gurobipy import GRB
# Build the model
[...]
# Optimize
model.optimize()
# do IIS if the model is infeasible
if model.Status == GRB.INFEASIBLE:
model.computeIIS()
To get the results of this IIS, you can save the ILP file using:
model.write('iismodel.ilp')
Alternatively, you can query the IIS attributes for each constraint and variable using IISConstr, IISLB, IISUB, IISSOS, IISQConstr, and IISGenConstr. Each indicates whether the corresponding model element is a member of the computed IIS. Here is an example of printing out the variable limits and linear constraints in the IIS:
# Print out the IIS constraints and variables
print('\nThe following constraints and variables are in the IIS:')
for c in model.getConstrs():
if c.IISConstr: print(f'\t{c.constrname}: {model.getRow(c)} {c.Sense} {c.RHS}')
for v in model.getVars():
if v.IISLB: print(f'\t{v.varname} ≥ {v.LB}')
if v.IISUB: print(f'\t{v.varname} ≤ {v.UB}')
You can customize the use of this method by ignoring or forcing elements into the IIS using the ISConstrForce, IISLBForce, IISUBForce, IISSOSForce, IISQConstrForce, and IISGenConstrForce attributes.
Example usage
You can review an example of Compute IIS with the workforce1 example (C, C++, C#, Java, MATLAB, Python, R, VB). If you store the ILP file, it will return the following IIS.
\ Model assignment_copy
\ LP format - for model browsing. Use MPS format to capture full model detail.
Minimize
Subject To
Thu4: x[Cathy,Thu4] + x[Ed,Thu4] = 4
Bounds
-infinity <= x[Cathy,Thu4] <= 1
-infinity <= x[Ed,Thu4] <= 1
End
This shows that the two variable upper limits of 1 on x[Cathy,Thu4] and x[Ed,Thu4] are inconsistent, with their sum constrained to 4. The sum of these two variables can be at most 2. This is why these three constraints are contradictory. However, the model can be feasible if either upper bounds or this constraint is removed.
Note: For Matlab, the IIS calculation and creation of an ILP file should be combined into one step:
>> params.resultfile = 'iismodel.ilp'
>> iis = gurobi_iis(model, params)
Comments
0 comments
Article is closed for comments.