You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Python的docplex打印线性规划的对偶模型?

用docplex生成并打印线性规划对偶模型

docplex本身没有直接生成对偶模型的内置API,但可以通过提取原始模型的核心信息,根据线性规划的对偶规则手动构建并打印对偶模型。以下是具体实现步骤和示例:

步骤说明

  1. 提取原始模型的目标类型(最大化/最小化)、约束的系数与右侧值、变量的边界信息。
  2. 根据对偶规则映射对偶变量与约束:
    • 原始最大化模型 → 对偶最小化模型;原始最小化模型 → 对偶最大化模型。
    • 原始的<=约束对应对偶的非负变量;>=约束对应对偶的非正变量;等式约束对应对偶的自由变量。
    • 原始的非负变量对应对偶的>=约束;非正变量对应对偶的<=约束;自由变量对应对偶的等式约束。
  3. 构建对偶模型后,通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 02:05:24