纸浆包中的整数线性程序生成错误

integer linear program in pulp package generate error

我正在尝试 运行 Jupyter 书中传输问题的示例代码,但生成错误
类型错误:列表索引必须是整数或切片,而不是 str。这里有什么问题?如何解决?谢谢!

    from pulp import *

# Creates a list of all the supply nodes
Warehouses = ["A","B"]

# Creates a dictionary for the number of units of supply for each supply node
supply = {"A": 1000,
        "B": 4000}

# Creates a list of all demand nodes
Bars = ["1", "2", "3", "4", "5"]

# Creates a dictionary for the number of units of demand for each demand node
demand = {"1": 500,
        "2": 900,
        "3": 1800,
        "4": 200,
        "5": 700}

costs = [   #Bars
        #1 2 3 4 5
         [2,4,5,2,1],#A  Warehouses
        [3,1,3,2,3] #B
         ]



# Creates the prob variable to contain the problem data
prob = LpProblem("Beer Distribution Problem", LpMinimize)

# Creates a list of tuples containing all the possible routes for transport
Routes = [(w,b) for w in Warehouses for b in Bars]

# A dictionary called route_vars is created to contain the referenced variables (the routes)
route_vars = LpVariable.dicts("Route",(Warehouses,Bars),0,None,LpInteger)


# The objective function is added to prob first
prob += lpSum([route_vars[w][b]*costs[w][b] for (w,b) in Routes]), "Sum of Transporting Costs"

# The supply maximum constraints are added to prob for each supply node (warehouse)
for w in Warehouses:
    prob += lpSum([route_vars[w][b] for b in Bars]) <= supply[w], "Sum of Products out of Warehouse %s"%w

# The demand minimum constraints are added to prob for each demand node (bar)
for b in Bars:
    prob += lpSum([route_vars[w][b] for w in Warehouses]) >= demand[b], "Sum of Products into Bars %s"%b

与 PuLP 问题相比,这更像是一个基本的 Python 问题。

w,b 是字符串。因此,在您的代码中,您正在评估 costs['A']['1']。如果您输入此内容,您会看到相同的错误消息。为了能够使用字符串索引,您需要使用字典而不是列表(数组)。

解决方案:使成本成为字典

一种方法是:

 costs = {'A': {'1':2,'2':4,'3':5,'4':2,'5':1},
          'B': {'1':3,'2':1,'3':3,'4':2,'5':3}}