如何使用docplex python API获取不可行约束?

w6mmgewl  于 2024-01-05  发布在  Python
关注(0)|答案(2)|浏览(401)

我正在研究电动汽车路径问题,我的问题的解决方案是不可行的。现在,我如何获得解决方案不可行的约束?我想使用Python API在docplex中获得违反的约束。

  1. solve_status = mdl.get_solve_status()
  2. if solve_status.name == 'INFEASIBLE_SOLUTION': # or also 'INFEASIBLE_OR_UNBOUNDED_SOLUTION'
  3. cref = cr.ConflictRefiner()
  4. print('show some of the constraints that can be removed to arrive at a minimal conflict')
  5. cref.refine_conflict(mdl, display=True)

字符串
我试过了,但这给了我一些违反的约束。不打印约束。

11dmarpk

11dmarpk1#

在docplex文档中,有一些函数可以显示冲突并在冲突上进行重命名:https://ibmdecisionoptimization.github.io/docplex-doc/mp/docplex.mp.conflict_refiner.html这些函数是docplex.mp.conflict_refiner.dislay()-显示所有冲突。docplex.mp.conflict_refiner.iter_conflicts()-返回冲突的迭代器(命名为元组)。

0vvn1miw

0vvn1miw2#

https://github.com/AlexFleischerParis/zoodocplex/blob/master/zoorelaxationandconflict.py上的小示例

  1. from docplex.mp.model import Model
  2. from docplex.mp.relaxer import Relaxer
  3. from docplex.mp.conflict_refiner import ConflictRefiner
  4. mdl = Model(name='buses')
  5. nbbus40 = mdl.integer_var(name='nbBus40')
  6. nbbus30 = mdl.integer_var(name='nbBus30')
  7. mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
  8. mdl.add_constraint(nbbus40 + nbbus30 <= 7, 'maxTotalBuses')
  9. mdl.minimize(nbbus40*500 + nbbus30*400)
  10. mdl.solve()
  11. mdl.report()
  12. print(f"* solve status is: '{mdl.solve_details.status}'") #infeasible model
  13. print()
  14. print("------- starting relaxation")
  15. print()
  16. rx = Relaxer()
  17. rx.relax(mdl)
  18. print ("number_of_relaxations= " + str(rx.number_of_relaxations))
  19. rx.print_information()
  20. mdl.report()
  21. print(f"* status after relaxation is: {mdl.solve_details.status}")
  22. #print(mdl.solution)
  23. print()
  24. print("------ starting conflict refiner")
  25. print()
  26. cr=ConflictRefiner()
  27. conflicts=cr.refine_conflict(mdl)
  28. conflicts.display()
  29. # for conflict in conflicts:
  30. # st = conflict.status
  31. # ct = conflict.element
  32. # label = conflict.name
  33. # label_type = type(conflict.element)
  34. # if isinstance(conflict.element, VarLbConstraintWrapper) \
  35. # or isinstance(conflict.element, VarUbConstraintWrapper):
  36. # ct = conflict.element.get_constraint()
  37. #
  38. # # Print conflict information in console
  39. # print("Conflict involving constraint: %s" % label)
  40. # print(" \tfor: %s" % ct)
  41. """
  42. which gives
  43. * solve status is: 'integer infeasible'
  44. ------- starting relaxation
  45. number_of_relaxations= 1
  46. * number of relaxations: 1
  47. - relaxed: maxTotalBuses, with relaxation: 1.0
  48. * total absolute relaxation: 1.0
  49. * model buses solved with objective = 3800
  50. * status after relaxation is: optimal relaxed sum of infeasibilities
  51. ------ starting conflict refiner
  52. conflict(s): 3
  53. - status: Member, Variable Lower Bound: nbBus30 >= 0
  54. - status: Member, LinearConstraint: kids: 40nbBus40+30nbBus30 >= 300
  55. - status: Member, LinearConstraint: maxTotalBuses: nbBus40+nbBus30 <= 7
  56. """

字符串

展开查看全部

相关问题