You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Pulp默认求解器获取对偶变量返回None的解决方法咨询

如何用PuLP默认求解器(CBC)获取对偶变量值

我明白你遇到的问题了——PuLP默认调用CBC求解器时,默认不会计算并返回对偶变量,所以你尝试访问约束的.pi属性时只能得到None。不过别担心,只要在求解时给CBC加个参数,就能轻松拿到对偶值!

问题根源

PuLP的默认求解器是CBC,但默认配置下它不会输出对偶变量信息。你需要显式告诉求解器要计算对偶变量,这样.pi属性才会被填充。

解决方案

修改你的求解调用,用PULP_CBC_CMD显式指定求解器,并通过options参数开启对偶计算。另外,要确保你访问的是已经添加到问题中的约束对象(而不是最初的不等式表达式)。

修改后的完整代码

from pulp import *

prob = LpProblem("test080", LpMinimize)
x = LpVariable("x", 0, 5)
y = LpVariable("y", -1, 1)
z = LpVariable("z", 0)

# 定义约束并直接赋值(prob += 返回的是LpConstraint对象)
c1 = prob += x + y <= 5, "c1"
c2 = prob += x + z >= 10, "c2"
c3 = prob += -y + z == 7, "c3"

# 添加目标函数
prob += x + 4*y + 9*z, "obj"

# 启用对偶变量计算的求解调用
prob.solve(PULP_CBC_CMD(options=["Duals"]))

# 打印每个约束的对偶值
print("对偶变量结果:")
for constraint_name, constraint in prob.constraints.items():
    print(f"{constraint_name}: {constraint.pi}")

# 也可以直接通过之前赋值的约束对象访问
print(f"\nc1的对偶值:{c1.pi}")
print(f"c2的对偶值:{c2.pi}")
print(f"c3的对偶值:{c3.pi}")

说明

  1. PULP_CBC_CMD(options=["Duals"]):这个参数告诉CBC求解器计算并返回对偶变量。你也可以加上msg=0来关闭求解过程的日志输出,让结果更整洁:PULP_CBC_CMD(msg=0, options=["Duals"])
  2. 约束对象的获取:要么通过prob.constraints字典遍历所有约束,要么在添加约束时直接捕获返回的LpConstraint对象(比如代码中的c1 = prob += ...),这样后续访问.pi属性就没问题了。

运行这段代码后,你就能看到每个约束对应的对偶变量值,而不是None啦!

内容的提问来源于stack exchange,提问作者TMart

火山引擎 最新活动