Абстрактная модель Pyomo - Стоимость за единицу при транспортировке зависит от количества отгруженного груза. - PullRequest
0 голосов
/ 02 мая 2018

Моя проблема - расширение транспортной проблемы. Переменная решения - это количество, необходимое для перемещения с одного склада на другой. Существует три вида затрат: входящий, исходящий и линейный. Моя цель - снизить общую стоимость. Однако входящие затраты на единицу зависят от количества, отгруженного с одного склада на другой, и отношение имеет форму пошаговой функции.

Примеры строк для входящей стоимости за единицу CSV-файла. Имеет две колонки: Количество и Входящие расходы на единицу . Ряд 1: 5 единиц и 10 долларов США, Ряд 2: 10 единиц и $ 30

Если отправленная единица составляет менее 5 единиц, то стоимость составляет 10 долларов США, а стоимость 30 долларов, если поставленная единица превышает 5 и меньше 10 единиц

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

def inbound_cost(qty):
    for index, row in inbound_cost.iterrows():
        if(value(qty)<=row["Quantity"]):
            return(row["inbound Cost per unit"])


def objective_rule(model):
    return sum(model.qty[SKU,Source,Destination]*inbound_cost(model.qty[SKU,Source,Destination]) for SKU in model.SKU for Source in model.Source for Destination in model.Destination)
model.objectiveFunc = Objective(rule = objective_rule, sense=minimize)

1 Ответ

0 голосов
/ 10 мая 2018

Есть много способов атаковать это:

  • Pyomo имеет встроенные средства для функций pwl (кусочно-линейные) в линейных моделях. Пожалуйста, проверьте документацию Pyomo, которая объясняет это подробно.

  • Это может быть смоделировано с последствиями (ограничения индикатора). В Pyomo вы можете использовать дизъюнкции. Пожалуйста, прочитайте документацию Pyomo для получения дополнительной информации.

  • Это можно смоделировать с помощью переменных SOS1. См. Документацию Pyomo, как их использовать.

  • Это может быть смоделировано с помощью двоичных переменных. На самом деле совсем по-разному.

Вот один пример того, как это может быть смоделировано линейно с использованием одной двоичной переменной. Пусть δ ∈ {0,1} (т.е. бинарная переменная). Тогда мы можем сформулировать:

 cost ≥ 5 x
 cost ≥ 10 x −  10 U (1-δ)  
 x ≤ 2 + δ U
 0 ≤ x ≤ U

Здесь U - верхняя граница по x.

...