Cplex 在二次规划中不满足下界(使用 Python API)
Cplex not meeting lower bound in quadratic programming (using Python API)
我正在尝试求解具有 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)
问题是你的模型不可行。尝试在调用 solve
方法之后添加以下代码行:
print("Solution status: {0} ({1})".format(
prob.solution.get_status_string(),
prob.solution.get_status()
))
您应该看到以下内容:
Solution status: infeasible (3)
你应该经常在解决后检查解决方案状态。否则,如您所见,求解结果将没有任何意义。
您可以使用 conflict refiner in the Python API 或交互式来了解问题可能出在哪里。
我正在尝试求解具有 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)
问题是你的模型不可行。尝试在调用 solve
方法之后添加以下代码行:
print("Solution status: {0} ({1})".format(
prob.solution.get_status_string(),
prob.solution.get_status()
))
您应该看到以下内容:
Solution status: infeasible (3)
你应该经常在解决后检查解决方案状态。否则,如您所见,求解结果将没有任何意义。
您可以使用 conflict refiner in the Python API 或交互式来了解问题可能出在哪里。