feasopt.py#
#!/usr/bin/env python3.11
# Copyright 2024, Gurobi Optimization, LLC
# This example reads a MIP model from a file, adds artificial
# variables to each constraint, and then minimizes the sum of the
# artificial variables. A solution with objective zero corresponds
# to a feasible solution to the input model.
#
# We can also use FeasRelax feature to do it. In this example, we
# use minrelax=1, i.e. optimizing the returned model finds a solution
# that minimizes the original objective, but only from among those
# solutions that minimize the sum of the artificial variables.
import sys
import gurobipy as gp
if len(sys.argv) < 2:
print("Usage: feasopt.py filename")
sys.exit(0)
feasmodel = gp.read(sys.argv[1])
# create a copy to use FeasRelax feature later
feasmodel1 = feasmodel.copy()
# clear objective
feasmodel.setObjective(0.0)
# add slack variables
for c in feasmodel.getConstrs():
sense = c.Sense
if sense != ">":
feasmodel.addVar(
obj=1.0, name=f"ArtN_{c.ConstrName}", column=gp.Column([-1], [c])
)
if sense != "<":
feasmodel.addVar(
obj=1.0, name=f"ArtP_{c.ConstrName}", column=gp.Column([1], [c])
)
# optimize modified model
feasmodel.optimize()
feasmodel.write("feasopt.lp")
# use FeasRelax feature
feasmodel1.feasRelaxS(0, True, False, True)
feasmodel1.write("feasopt1.lp")
feasmodel1.optimize()