无法使用 CPLEX 从 LP 中导出对偶值
Can't derive dual values from a LP using CPLEX
我正在尝试使用 CPLEX 编写 Bender 分解算法。为了确保我的编码正确,我遵循了 "Decomposition techniques in mathematical programming" by A.J 中的数字示例。 Conejo 等人,第 247 页。
但是,我的问题可以在没有访问提到的 material 或不了解上下文的情况下陈述。
我需要解决以下 LP 并为 "fixing_x" 约束导出对偶值。
import cplex
x_master_value = 100.
c_toy_slave = cplex.Cplex()
types = c_toy_slave.variables.type
y = c_toy_slave.variables.add(names=["y"+str(i) for i in range(3)], lb=[0]*3, types=[types.continuous]*3)
x = c_toy_slave.variables.add(names=["x"], lb=[0], types=[types.continuous])
w = c_toy_slave.variables.add(names=["w"], lb=[0], types=[types.continuous])
cst1 = c_toy_slave.linear_constraints.add([[["y0", "y1", "x", "w"], [-1, -3, 2, -1]]],
names=["cst1"], rhs=[2], senses=['L'])
cst2 = c_toy_slave.linear_constraints.add([[["y0", "y1", "x", "w"], [1, 3, -1, -1]]],
names=["cst2"], rhs=[3], senses=['L'])
cst3 = c_toy_slave.linear_constraints.add([[["y2", "x"], [1, -3]]],
names=["cst3"], rhs=[7/2], senses=['L'])
cst4 = c_toy_slave.linear_constraints.add([[["x"], [1]]],
names=["fixing_x"], rhs=[x_master_value], senses=['E'])
c_toy_slave.objective.set_linear([("y0", -1.5), ("y1", -2), ("y2", -2), ("w", 40)])
c_toy_slave.objective.set_sense(c_toy_slave.objective.sense.minimize)
c_toy_slave.solve()
print("lambda = ", c_toy_slave.solution.get_dual_values("fixing_x"))
但 CPLEX 表示它不能使用 get_dual_values 方法并提示此消息:
CPLEX 错误 1017:不可用于混合整数问题。
我不知道如何解决这个问题,因为我提供的输入不是 MIP,而是真正的 LP。
事实证明,删除 types=[type.continuous]
可选参数解决了我的问题(即,优化问题随后被正确识别为 LP)。如果我们查看 Cplex.variables.add 的文档,它说:
If types is specified, the problem type will be a MIP, even if all
variables are specified to be continuous.
所以,这是预期的行为。
我正在尝试使用 CPLEX 编写 Bender 分解算法。为了确保我的编码正确,我遵循了 "Decomposition techniques in mathematical programming" by A.J 中的数字示例。 Conejo 等人,第 247 页。
但是,我的问题可以在没有访问提到的 material 或不了解上下文的情况下陈述。 我需要解决以下 LP 并为 "fixing_x" 约束导出对偶值。
import cplex
x_master_value = 100.
c_toy_slave = cplex.Cplex()
types = c_toy_slave.variables.type
y = c_toy_slave.variables.add(names=["y"+str(i) for i in range(3)], lb=[0]*3, types=[types.continuous]*3)
x = c_toy_slave.variables.add(names=["x"], lb=[0], types=[types.continuous])
w = c_toy_slave.variables.add(names=["w"], lb=[0], types=[types.continuous])
cst1 = c_toy_slave.linear_constraints.add([[["y0", "y1", "x", "w"], [-1, -3, 2, -1]]],
names=["cst1"], rhs=[2], senses=['L'])
cst2 = c_toy_slave.linear_constraints.add([[["y0", "y1", "x", "w"], [1, 3, -1, -1]]],
names=["cst2"], rhs=[3], senses=['L'])
cst3 = c_toy_slave.linear_constraints.add([[["y2", "x"], [1, -3]]],
names=["cst3"], rhs=[7/2], senses=['L'])
cst4 = c_toy_slave.linear_constraints.add([[["x"], [1]]],
names=["fixing_x"], rhs=[x_master_value], senses=['E'])
c_toy_slave.objective.set_linear([("y0", -1.5), ("y1", -2), ("y2", -2), ("w", 40)])
c_toy_slave.objective.set_sense(c_toy_slave.objective.sense.minimize)
c_toy_slave.solve()
print("lambda = ", c_toy_slave.solution.get_dual_values("fixing_x"))
但 CPLEX 表示它不能使用 get_dual_values 方法并提示此消息: CPLEX 错误 1017:不可用于混合整数问题。 我不知道如何解决这个问题,因为我提供的输入不是 MIP,而是真正的 LP。
事实证明,删除 types=[type.continuous]
可选参数解决了我的问题(即,优化问题随后被正确识别为 LP)。如果我们查看 Cplex.variables.add 的文档,它说:
If types is specified, the problem type will be a MIP, even if all variables are specified to be continuous.
所以,这是预期的行为。