函数转换时遇‘local variable 'value' referenced before assignment’错误求助
解决「local variable 'value' referenced before assignment」错误
这个错误的核心原因很直白:你的函数里调用的value()是PuLP库的工具函数,但Python在当前函数作用域里找不到它的定义,所以误以为你要引用一个还没赋值的局部变量。
具体修复步骤
1. 修正value函数的引用方式
你有两种可行的修复选择:
- 如果你是通过
import pulp导入整个库,那需要把调用改成带库前缀的形式,明确告诉Python这是PuLP的函数:value_obj = pulp.value(prob.objective) - 如果你是选择性导入PuLP的组件(比如
from pulp import LpProblem, LpVariable, lpSum, LpStatus),那要把value也加入导入列表,让它进入当前作用域:from pulp import LpProblem, LpVariable, lpSum, LpStatus, value
2. 额外的代码优化提示(非错误,但影响结果有效性)
看你的代码里有一段双重循环:
for j in set_items: for i in set_trucks: x[j][i] <= y[i]
这行代码只是创建了一个不等式,但没有把它添加到优化问题prob中,相当于这个“物品分配到卡车则卡车必须启用”的约束完全没生效。你需要改成:
for j in set_items: for i in set_trucks: prob += x[j][i] <= y[i]
这样才能确保约束被纳入优化计算。
修复后的完整函数示例
def allocator(item_mass,item_vol,truck_mass,truck_vol,truck_cost): import pulp import numpy as np n_items = len(item_vol) set_items = range(n_items) n_trucks = len(truck_cost) set_trucks = range(n_trucks) y = pulp.LpVariable.dicts('truckUsed', set_trucks, lowBound=0, upBound=1, cat=pulp.LpInteger) x = pulp.LpVariable.dicts('itemInTruck', (set_items, set_trucks), lowBound=0, upBound=1, cat=pulp.LpInteger) prob = pulp.LpProblem("Truck allocation problem", pulp.LpMinimize) prob += pulp.lpSum([truck_cost[i] * y[i] for i in set_trucks]) for j in set_items: prob += pulp.lpSum([x[j][i] for i in set_trucks]) == 1 for i in set_trucks: prob += pulp.lpSum([item_mass[j] * x[j][i] for j in set_items]) <= truck_mass[i]*y[i] prob += pulp.lpSum([item_vol[j] * x[j][i] for j in set_items]) <= truck_vol[i]*y[i] for j in set_items: for i in set_trucks: prob += x[j][i] <= y[i] # 修复:将约束添加到问题中 prob.solve() x_soln = np.array([[x[i][j].varValue for i in set_items] for j in set_trucks]) y_soln = np.array([y[i].varValue for i in set_trucks]) lpstatus = pulp.LpStatus[prob.status] value_obj = pulp.value(prob.objective) # 修复:明确引用PuLP的value函数 return lpstatus, value_obj, x_soln, y_soln
内容的提问来源于stack exchange,提问作者Rahul Sharma
相关产品推荐
相关产品推荐

