我正在尝试解决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)
答案 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或交互式工具来了解问题所在。