使用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}")
说明
PULP_CBC_CMD(options=["Duals"]):这个参数告诉CBC求解器计算并返回对偶变量。你也可以加上msg=0来关闭求解过程的日志输出,让结果更整洁:PULP_CBC_CMD(msg=0, options=["Duals"])。- 约束对象的获取:要么通过
prob.constraints字典遍历所有约束,要么在添加约束时直接捕获返回的LpConstraint对象(比如代码中的c1 = prob += ...),这样后续访问.pi属性就没问题了。
运行这段代码后,你就能看到每个约束对应的对偶变量值,而不是None啦!
内容的提问来源于stack exchange,提问作者TMart




