Cplex未达到二次编程的下限(使用Python API)

时间:2018-09-28 12:56:59

标签: python cplex quadratic-programming

我正在尝试解决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)

1 个答案:

答案 0 :(得分:1)

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

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

您应该看到以下内容:

Solution status: infeasible (3)

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

您可以使用conflict refiner中的Python API或交互式工具来了解问题所在。