Hide navigation sidebar
Hide table of contents sidebar
Back to top
Toggle table of contents sidebar

# feasopt.py

    #!/usr/bin/env python3

    # Copyright 2025, 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()

Help and Feedback

Press `/` or click to search this documentation | Gurobi website | Gurobi community forum
Go to other Gurobi documentation | Gurobi download | Contact support