Hi,
let's go on with the example from https://www.linkedin.com/pulse/what-optimization-how-can-help-you-do-more-less-zoo-buses-fleischer/
Not all models are feasible so let's see how we can display relaxation and conflicts with the docplex python API.
from docplex.mp.model import Model
from docplex.mp.relaxer import Relaxer
from docplex.mp.conflict_refiner import ConflictRefiner
from docplex.mp.conflict_refiner import ConflictRefiner, VarUbConstraintWrapper, VarLbConstraintWrapper
mdl = Model(name='buses')
nbbus40 = mdl.integer_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
mdl.add_constraint(nbbus40 + nbbus30 <= 7, 'maxTotalBuses')
mdl.minimize(nbbus40*500 + nbbus30*400)
mdl.solve()
print(mdl.report())
print("solve status =",mdl.get_solve_status()) #infeasible model
print()
print("relaxation")
print()
rx = Relaxer()
rx.relax(mdl)
print ("number_of_relaxations= " + str(rx.number_of_relaxations))
print(rx.relaxations())
print(mdl.report())
print(mdl.get_solve_status())
print(mdl.solution)
print()
print("conflict")
print()
cr=ConflictRefiner()
conflicts=cr.refine_conflict(mdl)
print(mdl.get_solve_status())
for conflict in conflicts:
st = conflict.status
ct = conflict.element
label = conflict.name
label_type = type(conflict.element)
if isinstance(conflict.element, VarLbConstraintWrapper) \
or isinstance(conflict.element, VarUbConstraintWrapper):
ct = conflict.element.get_constraint()
# Print conflict information in console
print("Conflict involving constraint: %s" % label)
print(" \tfor: %s" % ct)
gives
None
solve status = JobSolveStatus.INFEASIBLE_SOLUTION
relaxation
number_of_relaxations= 1
{docplex.mp.LinearConstraint[maxTotalBuses](nbBus40+nbBus30,LE,7): 1.0}
* model buses solved with objective = 3800
None
JobSolveStatus.INFEASIBLE_SOLUTION
solution for: buses
objective: 3800
nbBus40=6
nbBus30=2
conflict
JobSolveStatus.INFEASIBLE_SOLUTION
Conflict involving constraint: None
for: nbBus30 >= 0
Conflict involving constraint: kids
for: kids: 40nbBus40+30nbBus30 >= 300
Conflict involving constraint: maxTotalBuses
for: maxTotalBuses: nbBus40+nbBus30 <= 7
regards
Many other very simple examples at https://www.linkedin.com/pulse/making-optimization-simple-python-alex-fleischer/
#CPLEXOptimizers#DecisionOptimization