使用字符串标识公司时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
相关产品推荐
相关产品推荐

