Установить условное ограничение, Pulp - PullRequest
0 голосов
/ 20 марта 2020

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

Задача состоит в том, чтобы максимизировать доход путем информирования ежемесячной производственной мощности завода о том, какой продукт производить, на основе прогнозной цены за продукт за вычетом затрат (естественно, здесь пропущено множество других ограничений, иначе это было бы гораздо проще) ,

Для приведенных ниже данных мне необходимо установить следующие ограничения:

  1. Завод может производить только один продукт в месяц, несмотря на то, что он способен производить несколько продуктов.

, который ограничивает производство одним продуктом в месяц. Я довольно новичок в целлюлозе, но, несмотря на траление документации и ТАК, я не могу найти пример реализации.

Производственные данные:

production data

product forecast price data

Мой код пока

# omitted data etl logic - it is formatted as per the above images

# Get production info
plants = LpVariable.dicts('plants',
    ((month, plant, product) for month, plant, product in wp_df.index if month >= 4),
    lowBound = 0,
    cat='Integer')

# Get forecast price info by product
forecast_prices =  LpVariable.dicts('price_by_prod',
    ((month, contract) for month, contract in fcst_diffs.index if month >= 4),
    lowBound = 0,
    cat='Integer') 

# Prod costs for each month, plant.
costs = LpVariable.dicts(
    'prod costs',
    ((month, plant) for month, plant in prod_costs_df.index),
    lowBound=0,
    cat='Integer')

# Define problem
model = LpProblem('Revenue Maximising Production Optimisation',
                  LpMaximize)

# Define objective function
model += lpSum(
    [plants[m,w,g] * wp_df.loc[(m,w,g), 'production_output'] for m, w, g in wp_df.index]
    + [costs[m, w] * costs_df.loc[(m,w), 'prod_costs_usd'] for m, w in prod_costs_df.index]
)

Пока я опускаю ограничения, так как у меня довольно много настроек.

Спасибо за помощь, спасибо.

1 Ответ

0 голосов
/ 22 марта 2020

Введите набор двоичных переменных, которые индексируются {завод, продукт, месяц}, которые определяют, используется ли завод i для производства продукта j в течение месяца k. Переменная будет 1, если это так, и 0 в противном случае.

Затем вам нужно будет добавить ограничения, чтобы количество продукта j, производимого на заводе i в течение месяца k ограничено. Обычно это можно сделать с помощью ограничения, ограничивающего эту сумму переменной <= b*C, где b - двоичная переменная, а C - способность этого завода производить этот продукт.

Наконец, вам нужно ограничить каждый завод, чтобы он делал только один продукт в течение каждого месяца. Для каждого месяца и для каждого завода сумма этих бинарных переменных для всех продуктов ограничена: <= 0.

Удачи!

...