«TypeError: объект int не является подписным» при определении ограничений Glop Solver? - PullRequest
0 голосов
/ 27 февраля 2020

Я очень новичок в Python, так что прости меня, если это глупый вопрос - но я пытался понять, почему я получаю эту ошибку каждый раз, когда пытаюсь определить свои ограничения в задаче оптимизации Я работаю над.

Ниже мой код:

# input parameters
product = ['Chairs', 'Desks', 'Tables']               # list of product names
department = ['Fabrication', 'Assembly', 'Shipping']  # list of constraint names
profit = [15.00, 24.00, 18.00]                        # list of product profit coefficients
max_sales = [360, 300, 100]                           # list of maximum sales for each product
hours_req = [[4, 6, 2], [3, 5, 7], [3, 2, 4]]         # two dimensional list of hour constraint coefficients
                                                      # each sublist corresponds to a constraint
hours_avl = [1850, 2400, 1500]                        # list of hours available for each department

# initialize LP model object
mymodel = glp.Solver('Lexington', glp.Solver.GLOP_LINEAR_PROGRAMMING)

# define decision variables
dvar = list(range(len(product)))         # create a list to store one variable for each product
for i in range(len(product)):            # loop to create a variable for each product
    dvar[i] = mymodel.NumVar(0, mymodel.infinity(), product[i])
                                         # arguments: (lower bound, upper bound, name)

# define objective function
TotProfit = mymodel.Objective()          # create objective function object
TotProfit.SetMaximization()              # set direction of optimization
for i in range(len(product)):      # loop to set the objective coefficient for each product variable
    TotProfit.SetCoefficient(dvar[i], profit[i])
                                         # arguments: (variable, coefficient)

# define constraints
hours_constr = list(range(len(department)))
for h in range(len(department)):
    constr[h] = mymodel.Constraint(0, hours_avl[h])
    for f in range(len(product)):
        constr[h].SetCoefficient(dvar[f], hours_req[h][f])
    for a in range(len(product)):
        constr[h].SetCoefficient(dvar[a], hours_req[h][a])
    for s in range(len(product)):
        constr[h].SetCoefficient(dvar[s], hours_req[h][s])

sales_constr = list(range(len(product)))
for s in range(len(product)):
    constr[s] = mymodel.Constraint(0, max_sales[s])
    for c in range(len(department)):
        constr[s].SetCoefficient(dvar[c], max_sales[s][c])
    for d in range(len(department)):
        constr[s].SetCoefficient(dvar[d], max_sales[s][d])
    for t in range(len(department)):
        constr[s].SetCoefficient(dvar[t], max_sales[s][t])

Весь приведенный выше код работает нормально, пока я не докажу второе ограничение (sales_constr). В этот момент мне выдается следующее сообщение об ошибке:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-116-a5209111faaa> in <module>
     14     constr[s] = mymodel.Constraint(0, max_sales[s])
     15     for c in range(len(department)):
---> 16         constr[s].SetCoefficient(dvar[c], max_sales[s][c])
     17     for d in range(len(department)):
     18         constr[s].SetCoefficient(dvar[d], max_sales[s][d])

TypeError: 'int' object is not subscriptable

Кто-нибудь знает, почему я получаю это сообщение? Я пытался понять это слишком долго, и я совершенно тупик, поэтому любая помощь будет очень признательна!

Спасибо!

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020
max_sales = [360, 300, 100]

max_sales - это массив целых чисел, но в строке 16 вы используете два индекса:

         constr[s].SetCoefficient(dvar[c], max_sales[s][c])

, что означает вы лечите целое число как массив .

0 голосов
/ 27 февраля 2020

Вы вызываете позицию списка здесь constr[s].SetCoefficient(dvar[d], max_sales[s][d]) которая является int переменной и пытается вызвать метод SetCoefficient.

Вы должны создать экземпляр класса, которому SetCoefficient принадлежит или унаследован затем вызовите метод, примерно так:

...
it = MyClass()
it.SetCoefficient(x, y)
...

Я не знаю, что вы используете, но я ищу метод и нашел его здесь . Надеюсь, это поможет.

...