Ошибка оптимизации целлюлозы - объект LPVariable не поддерживает индексирование - PullRequest
0 голосов
/ 11 июня 2019

Я постоянно получаю ошибки при попытке добавить ограничение, расположенное в строке 31, модель + = ([MAHL [i] [j] для (i, j) в годовых часах]) <= 40 </p>

Я не уверен, как правильно установить это ограничение.Я пытаюсь сказать, что при каждом индексе i и j определенное значение должно быть меньше 40, и я делаю это для всех пар i, j.

Я очень новичок в PULP и пытаюсь получитьбазовая модель и работает.Входные данные - это просто набор случайных значений длиной 365 строк и шириной 24 столбца.

from pulp import *
import pandas as pd
import numpy as np
import xlrd

model = pulp.LpProblem("Basic Model", pulp.LpMaximize)

YPER = 365
HE = 24

yearlyhours = [(i,j) for i in range(YPER) for j in range(HE)]

xlsx = pd.ExcelFile('IvA.xlsx')
df1 = pd.read_excel(xlsx, 'Sheet5')
df2 = pd.read_excel(xlsx, 'Sheet3')
df3 = pd.read_excel(xlsx, 'Sheet2')

MAHL = pulp.LpVariable('MAHL', (YPER, HE), cat='Integer')
MALL = pulp.LpVariable('MALL', cat='Integer')
DAHL = pulp.LpVariable('DAHL', cat='Integer')
DALL = pulp.LpVariable('DALL', cat='Integer')

book = xlrd.open_workbook('IvA.xlsx')
sheet10 = book.sheet_by_name('Sheet10')
sheet11 = book.sheet_by_name('Sheet11')

DAPRICE = [[sheet10.cell_value(r, c) for c in range(sheet10.ncols)] for r in range(sheet10.nrows)]
LOAD = [[sheet11.cell_value(r, c) for c in range(sheet11.ncols)] for r in range(sheet11.nrows)]

#model += (MAHL[i][j] for i in range(YPER) for j in range(HE)) <= 40
model += ([MAHL[i][j] for (i,j) in yearlyhours]) <= 40

model += (pulp.lpSum([DAPRICE[i][j] * LOAD[i][j] for i in range(YPER) for j in range(HE)]))

model.solve()
pulp.LpStatus[model.status]
print("Status:", LpStatus[model.status])

obj = value(model.objective)
print(obj)

Я опробовал несколько решений, одно дополнительное закомментировано.

Traceback (most recent call last):
  File "bs.py", line 31, in <module>
    model += ([MAHL[i][j] for (i,j) in yearlyhours]) <= 40
  File "bs.py", line 31, in <listcomp>
    model += ([MAHL[i][j] for (i,j) in yearlyhours]) <= 40
TypeError: 'LpVariable' object does not support indexing

1 Ответ

3 голосов
/ 11 июня 2019

Вы определили MAHL как pulp.LpVariable, который (как состояния ошибки) не поддерживает индексирование, поскольку он моделирует переменную LP.

Вы можете определить его, используя pulp.LpVariable.dicts.

Пример:

MAHL = pulp.LpVariable.dicts('MAHL', yearlyhours, cat=pulp.LpInteger)

и именуем его

model += pulp.lpSum([MAHL[(i,j)] for (i,j) in yearlyhours]) <= 40
...