Задача оптимизации планирования целлюлозы - несколько входов со временем - PullRequest
0 голосов
/ 18 февраля 2020

В настоящее время я строю план планирования в целлюлозе, однако я изо всех сил пытаюсь понять, как представить переменную подачи для анализа целлюлозы, поскольку данные содержатся в многоиндексном фрейме данных.

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

Данные по току

enter image description here

Я знаю, что пульпа принимает словари переменных в качестве входных данных, например:

LpVariable.dicts("Route",(plant, output)

, однако я не уверен, как я могу представить поставка здесь как:

(месяц, завод, продукт, production_output)

Любая помощь с благодарностью.

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Вы можете использовать кортеж месяца, завода и продукта в качестве ключа для словаря переменных, а также использовать его для получения Output Output Mt из кадра данных.

import pulp

months = range(1,12)
plants = ['A', 'B', 'C', 'D', 'E']
products = ['AFS', 'GDF', 'POD', 'PPI']

# set up binary variables for plant-month-product
var_dict = {}
for month in months:
    for plant in plants:
        for product in product:
            combo = (month, plant, product)
            var_name = '_'.join([str(c) for c in combo])
            var_dict[combo] = LpVariable(var_name, cat=LpBinary)

prob = LpProblem('Schedule', LpMinimize)

# objective function
# assume data in df and has index of month, plant, and product
prob += lpSum([var * df.loc[('at', k), 'Production Output (Mt)']
               for k, v in var_dict.items()]

# then add the relevant constraints
# for example, one and only one product per plant per month
# remember that in var_dict the key is a tuple of month, plant, product
# and the value is the binary variable
for month in months:
    for plant in plants:
        prob += lpSum([v for k, v in var_dict.items()
                       if k[0] == month and k[1] == plant]) == 1
1 голос
/ 18 февраля 2020

Я думаю, что вы хотите сделать, это иметь переменные решения, которые определяют, сколько поставлять каждый продукт в каждый месяц , на каждом заводе . Другими словами, у вас есть индексы: (месяцы, заводы, продукты).

Это, конечно, создаст всего len(months)*len(plants)*len(products) переменных, которые в примере составляют 12 * 5 * 4 = 240 переменных.

Я бы обработал случай заводов, которые не могут производить определенный продукт, установив мощность этого продукта с этого завода на ноль.

import pulp

months = range(1,12)
plants = ['A', 'B', 'C', 'D', 'E']
products = ['AFS', 'GDF', 'POD', 'PPI']

supply = pulp.LpVariable.dicts("supply", (months, plants, products))
print(supply)

Это вернет переменные, на которые можно ссылаться как, например: supply[3]['A']['POD']

...