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

使用字符串标识公司时Pulp优化代码报索引错误,如何解决?

用字符串标识公司的线性规划模型修改方案

错误原因

当companies使用字符串列表(如["A", "B", "C"])时,代码中profits[i]和costs[i]的i是字符串类型,而列表仅支持整数索引,因此触发TypeError;若字符串与列表长度不匹配还会引发IndexError。

解决方案

方法1:将利润/成本改为字典(推荐,逻辑更直观)

把profits和costs从列表改为以公司字符串为键的字典,直接通过公司名关联对应数值:

import pulp

# 定义公司列表及对应的利润、成本字典
companies = ["A", "B", "C"]
profits = {"A": 3, "B": 2, "C": 3}
costs = {"A": 2, "B": 1, "C": 1}

# 创建二进制决策变量
company_vars = pulp.LpVariable.dicts('company', companies, cat='Binary')

# 初始化最大化利润的LP问题
lp_problem = pulp.LpProblem('Maximize Profit', pulp.LpMaximize)

# 添加目标函数
lp_problem += pulp.lpSum([company_vars[i] * profits[i] for i in companies])

# 添加总成本约束
lp_problem += pulp.lpSum([company_vars[i] * costs[i] for i in companies]) <= 3

# 求解
lp_problem.solve()

# 输出结果
print(f'Optimal profit: {lp_problem.objective.value()}')
for i in companies:
    if company_vars[i].value() == 1:
        print(f'Business {i} should be bought.')

方法2:保持列表结构,用enumerate关联索引与公司名

无需修改profits和costs的列表结构,通过enumerate同时获取列表索引和公司字符串,用索引取对应数值:

import pulp

companies = ["A", "B", "C"]
profits = [3, 2, 3]
costs = [2, 1, 1]

company_vars = pulp.LpVariable.dicts('company', companies, cat='Binary')
lp_problem = pulp.LpProblem('Maximize Profit', pulp.LpMaximize)

# 目标函数:用enumerate获取索引和公司名
lp_problem += pulp.lpSum([company_vars[comp] * profits[idx] for idx, comp in enumerate(companies)])

# 约束条件:同理使用enumerate
lp_problem += pulp.lpSum([company_vars[comp] * costs[idx] for idx, comp in enumerate(companies)]) <= 3

lp_problem.solve()

print(f'Optimal profit: {lp_problem.objective.value()}')
for i in companies:
    if company_vars[i].value() == 1:
        print(f'Business {i} should be bought.')

预期输出

两种方法均会输出:

Optimal profit: 6
Business A should be bought.
Business C should be bought.

内容的提问来源于stack exchange,提问作者Mynameiswha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:31:03