You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:40:36