使用PuLP优化库存分配时遭遇TypeError错误求助
解决PuLP库存分配优化中TypeError: list indices must be integers or slices, not str的问题
错误根源
这个错误是因为你尝试用字符串(零件编号)去索引列表导致的。你的material_price是列表类型,只能通过整数下标(比如material_price[0])访问元素,但在目标函数环节你用了零件编号字符串(比如"PART001")作为索引,触发类型错误。
修复步骤
1. 将价格列表转换为字典
把material_items(零件编号列表)和material_price(价格列表)配对,生成以零件编号为键的字典,这样就能用字符串直接获取对应价格:
price_dict = dict(zip(material_items, material_price))
2. 确保变量索引一致性
确认PuLP决策变量的键、material_demand的索引、price_dict的键完全一致(都是零件编号字符串),避免索引不匹配问题。
3. 修正目标函数中的索引调用
把目标函数中原来调用material_price[item]的地方替换为price_dict[item];如果涉及需求数据,确保用material_demand.loc[item, 列名]的方式通过字符串索引访问DataFrame数据。
完整示例代码
import pulp as lp import pandas as pd # 替换为你的实际数据 material_items = ["PART001", "PART002", "PART003"] material_price = [10, 20, 15] material_demand = pd.DataFrame( {'monthly_demand': [50, 30, 40]}, index=material_items ) # 转换价格为字典 price_dict = dict(zip(material_items, material_price)) # 初始化优化问题 prob = lp.LpProblem("MaximizeServiceRate", lp.LpMaximize) # 定义决策变量:每个零件的库存分配量(非负) inventory = lp.LpVariable.dicts("Inventory", material_items, lowBound=0) # 目标函数:最大化总服务率(满足需求/总需求的比例之和) total_service = lp.lpSum( lp.lpMin(inventory[item], material_demand.loc[item, 'monthly_demand']) / material_demand.loc[item, 'monthly_demand'] for item in material_items ) prob += total_service, "TotalServiceRate" # 示例约束:总库存成本不超过预算 budget = 1000 prob += lp.lpSum(inventory[item] * price_dict[item] for item in material_items) <= budget, "CostBudget" # 求解问题 prob.solve(lp.PULP_CBC_CMD(msg=0)) # 输出结果 print("优化状态:", lp.LpStatus[prob.status]) for item in material_items: print(f"{item} 分配库存: {inventory[item].varValue:.2f}") print(f"总服务率: {lp.value(prob.objective):.4f}")
额外检查点
- 确认
material_items中的所有零件编号都存在于material_demand的索引中,避免KeyError; - 如果目标函数的服务率计算逻辑不同(比如加权服务率),只需要调整目标函数的表达式,核心是确保所有索引调用都是合法的(字典用字符串键,DataFrame用
.loc+字符串索引)。
内容的提问来源于stack exchange,提问作者user3833880
相关产品推荐
相关产品推荐

