为何Pulp中lpDot(a,n)与lpSum([a[i]*n[i]])在约束中不等价?
问题根源:字典迭代的默认行为导致
lpDot计算错误 你遇到的问题核心是**pulp.lpDot传入字典时,迭代的是字典的键而非值**:
lpSum([a[i] * n[i] for i in range(N)])是正确的:它显式取字典n中每个键对应的值,计算3.5*n[0] + 2*n[1],约束有效限制了n的取值。lpDot(a, n)则是错误的:Python中迭代字典n默认遍历键(即0和1),实际计算的是3.5*0 + 2*1 = 2,这个约束对n完全没有限制,求解器自然会选择让目标函数最小的n值([2,2]对应的t总和更小)。
验证与修正
计算n=[2,2]时,3.5*2 + 2*2 = 11 > 10,确实违反预期约束,但此时lpDot(a,n)的实际计算结果是2 ≤10,完全满足,所以求解器认为该解合法。
要让lpDot和lpSum等价,需要传入字典的值而非字典本身:
# 正确的lpDot用法:传入n的值列表 problem += pulp.lpDot(a, n.values()) <= 10 # 或者显式转换为列表 problem += pulp.lpDot(a, [n[i] for i in range(N)]) <= 10
补充说明
pulp.lpDot要求两个输入是结构匹配的可迭代对象(比如两个列表、两个值序列)。当其中一个是字典时,必须明确指定迭代其值,否则会按键计算,导致逻辑错误。
内容的提问来源于stack exchange,提问作者Yfiua
相关产品推荐
相关产品推荐

