【问题标题】:Cplex not meeting lower bound in quadratic programming (using Python API)Cplex 不满足二次编程中的下限(使用 Python API)
【发布时间】:2018-09-28 12:56:59
【问题描述】:

我正在尝试解决具有 k 个未知数的二次规划问题。问题是可分离的,即定义问题的 Q 矩阵中的所有非对角线都为零。还有一些线性约束。

我发现 Cplex 给出了不满足零下限的解决方案。我无法弄清楚我将问题输入到生成此类解决方案的 Cplex 的方式有什么问题。请注意 min v 是负数,而我希望 v 中的所有值都在 0 和 1 之间。

下面是我的代码。

from __future__ import division
import cplex
from cplex.exceptions import CplexError

k = 29

prob = cplex.Cplex()
prob.objective.set_sense(prob.objective.sense.minimize)
separable = [1.0] * k
prob.objective.set_quadratic(separable)
my_ub = [1.0] * k
my_lb = [0.0] * k
prob.variables.add(ub=my_ub, lb=my_lb)

my_rhs = [10.1, 3.1, 3.1, 3.1, 3.1, 4.1, 3.1, 3.1, 3.1, 4.1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
my_sense = 'EEEEEEEEEEEEEEEEEEEE'
prob.linear_constraints.add(rhs=my_rhs, senses=my_sense)
constraints_rowColVal = [(0, 9, 3.1), (0, 11, 3.1), (0, 13, 3.1), (0, 15, 3.1), (0, 17, 4.1), (0, 20, 3.1), (0, 22, 3.1), (0, 24, 3.1), (0, 26, 4.1), (1, 0, 10.1), (1, 14, 3.1), (1, 25, 3.1), (1, 27, 4.1), (2, 1, 10.1), (2, 10, 3.1), (2, 21, 3.1), (2, 28, 4.1), (3, 2, 10.1), (3, 12, 3.1), (4, 3, 10.1), (5, 4, 10.1), (5, 16, 3.1), (6, 5, 10.1), (6, 18, 4.1), (7, 6, 10.1), (7, 19, 4.1), (8, 7, 10.1), (8, 23, 3.1), (9, 8, 10.1), (10, 0, 1), (10, 1, 1), (10, 2, 1), (10, 3, 1), (10, 4, 1), (10, 5, 1), (10, 6, 1), (10, 7, 1), (10, 8, 1), (11, 9, 1), (11, 10, 1), (12, 11, 1), (12, 12, 1), (13, 13, 1), (13, 14, 1), (14, 15, 1), (14, 16, 1), (15, 17, 1), (15, 18, 1), (15, 19, 1), (16, 20, 1), (16, 21, 1), (17, 22, 1), (17, 23, 1), (18, 24, 1), (18, 25, 1), (19, 26, 1), (19, 27, 1), (19, 28, 1)]
prob.linear_constraints.set_coefficients(constraints_rowColVal)

prob.solve()
v = prob.solution.get_values()
print min(v)

【问题讨论】:

    标签: python cplex quadratic-programming


    【解决方案1】:

    问题是您的模型不可行。尝试在调用solve 方法之后添加以下代码行:

    print("Solution status: {0} ({1})".format(
        prob.solution.get_status_string(),
        prob.solution.get_status()
    ))
    

    您应该看到以下内容:

    Solution status: infeasible (3)
    

    您应始终在求解后检查求解状态。否则,如您所见,求解结果将毫无意义。

    您可以使用Python API 中的conflict refiner 或交互来了解问题可能出在哪里。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 2020-09-08
      • 2021-07-20
      相关资源
      最近更新 更多