如何通过Python的docplex打印线性规划的对偶模型?
用docplex生成并打印线性规划对偶模型
docplex本身没有直接生成对偶模型的内置API,但可以通过提取原始模型的核心信息,根据线性规划的对偶规则手动构建并打印对偶模型。以下是具体实现步骤和示例:
步骤说明
- 提取原始模型的目标类型(最大化/最小化)、约束的系数与右侧值、变量的边界信息。
- 根据对偶规则映射对偶变量与约束:
- 原始最大化模型 → 对偶最小化模型;原始最小化模型 → 对偶最大化模型。
- 原始的
<=约束对应对偶的非负变量;>=约束对应对偶的非正变量;等式约束对应对偶的自由变量。 - 原始的非负变量对应对偶的
>=约束;非正变量对应对偶的<=约束;自由变量对应对偶的等式约束。
- 构建对偶模型后,通过
print_information()或export_as_lp_string()方法输出模型。
代码示例
1. 先定义原始线性规划模型
from docplex.mp.model import Model # 构建原始LP模型 original_model = Model(name="原始LP模型") x1 = original_model.continuous_var(name="x1", lb=0) x2 = original_model.continuous_var(name="x2", lb=0) # 目标函数:最大化 3x1 + 4x2 original_model.maximize(3 * x1 + 4 * x2) # 添加约束 original_model.add_constraint(2 * x1 + x2 <= 100, "c1") original_model.add_constraint(x1 + x2 <= 80, "c2") original_model.add_constraint(x1 <= 40, "c3")
2. 构建并打印对偶模型
# 初始化对偶模型 dual_model = Model(name="对偶LP模型") # 根据原始约束定义对偶变量(原始为<=约束,对偶变量非负) y1 = dual_model.continuous_var(name="y1", lb=0) # 对应原始约束c1 y2 = dual_model.continuous_var(name="y2", lb=0) # 对应原始约束c2 y3 = dual_model.continuous_var(name="y3", lb=0) # 对应原始约束c3 # 对偶目标函数(最小化,系数为原始约束的右侧值) dual_model.minimize(100 * y1 + 80 * y2 + 40 * y3) # 根据原始变量定义对偶约束(原始变量非负,对偶约束为>=) dual_model.add_constraint(2 * y1 + y2 + y3 >= 3, "对偶约束_x1") dual_model.add_constraint(y1 + y2 >= 4, "对偶约束_x2") # 打印对偶模型信息 print("对偶模型基本信息:") dual_model.print_information() print("\n对偶模型LP格式输出:") print(dual_model.export_as_lp_string())
通用扩展说明
如果需要处理更复杂的原始模型(包含等式约束、自由变量等),只需调整对偶变量的边界和对偶约束的类型即可。例如:
- 原始等式约束 → 对偶变量设为自由变量(
lb=-inf, ub=inf) - 原始自由变量 → 对偶约束设为等式约束
内容的提问来源于stack exchange,提问作者mdslt
相关产品推荐
相关产品推荐

