如何使用 CPLEX Multi-Objective (ObjectiveSense) 参数

How to use CPLEX Multi-Objective (ObjectiveSense) parameters

我正在处理纯 LP 问题并使用 Multi-Objective 来解决它。当我使用 objective 和权重时:

solver1.minimize(  A* 1000
                                  + B* 10000
                                  + C* 100
                                  + D* 1
                          )

求解器能够成功得到最优结果

但是当我使用 ObjectiveSense 包时 objective:

solver1.set_multi_objective(ObjectiveSense.Minimize, [A, B, C,D]
                   , priorities=[1, 2, 0, 1], weights=[1000,1,1,1])

求解器在第一层次求解后变得不可行并给出:“非最佳状态:不可行的 CPLEX 错误 1300:无法求解多 objective 子问题。”

我想弄清楚如何使用参数 reltol 和 abstol 来获得可行的解决方案。有什么想法或例子吗?

虽然我们有加权 objective 的解决方案,但也试图理解为什么 Multi-Objective 变得不可行?任何关于相同的输入都会有所帮助。

谢谢!

本页 https://www.ibm.com/docs/en/icos/12.10.0?topic=optimization-solving-multiple-objective-problems 详细解释了如何使用公差来解决多 objective 问题。 总而言之,LP 和 MIP 使用了两种不同的算法。 LP 算法使用 LP 基础,绝对公差被解释为降低成本的限制,并且不使用相对成本。 MIP 算法使用迭代求解方法,其中公差被解释为每个中间子 objective.

的公差

当模型具有困难的数值属性时,我们已经看到 LP 算法可能失败的情况。要检查这种情况,运行 在您的模型上添加以下行: 系数的范围不要超过1e+6.

print(mdl.cplex_matrix_stats)

作为解决方法,您可以尝试 Docplex 中的 Model.solve_with_goals 方法,该方法 运行 是适用于任何类型模型的迭代多 objective 算法。