Написание многоуровневого ценообразования как линейной программы - PullRequest
0 голосов
/ 24 октября 2018

Есть ли способ написать функцию стоимости, которая использует многоуровневое ценообразование как линейную программу?

supplier   volume A   price A   volume B   price B
1          0          $1        300        $2
2          0          $3        500        $1.50

Под многоуровневым ценообразованием я подразумеваю поставщика 1: первые 300 кг стоят 1 доллар, а вторые 200 кг - 2 доллара.(Нет, если я достигну более 300 кг, тогда все единицы стоят $ 2).Это функция стоимости, которую я сейчас изучаю.

cost = P1a * V1 + P1b * V1 + P2a * V2 + P2b * V2

s.t     V1+V2 = 1000
        V2 < 8000, V1 < 800
where
P1a = first price bracket for supplier 1
P1b = second price bracket for supplier 1
V1 = volume for supplier 1

Если в этом случае весь объем становится ценой B, когда достигается объем B, тогда я могу добавить двоичную переменную, чтобы функциявыглядит так

cost = u * P1a * V1 + v * P1b * V1 + x * P2a * V2 + y * P2b * V2

s.t     u+v = 1, x+y = 1

u,v,x,y = 1 if price bracket is used, 0 if price bracket isnt used

Есть ли способ сделать что-то подобное?

Редактировать: V1 и V2 оба являются целыми числами и имеют установленную верхнюю крышку, скажем, 800 кг.Существует также ограничение спроса, скажем, V1 + V2 = 1000.

1 Ответ

0 голосов
/ 26 октября 2018

Это представляется возможным при условии наличия константы M>=0, которая является общей верхней границей для переменных объема V1 и V2 (например, если есть ограничение V1+V2 <=M).При условии, что существует такой M, давайте введем две двоичные переменные b_1 и b_2, которые указывают (то есть имеют значение 1), если V1>= 300 и V2>=500 соответственно:

300 * b_1 <= V1 <= 300 * (1 - b_1) + M* b_1
500 * b_2 <= V2 <= 500 * (1 - b_2) + M* b_2

Теперь мы вводим неотрицательные переменные a_1, h_1, которые будут разлагать V1 на части, меньшие 300 (обозначены a_1), и на части, содержащие части, превышающие (обозначенные переменными h_1):

V1= a_1 + h_1
h_1 <= M b_1
300 b_1 <= a_1 <= 300  

Последние два ограничения с двоичной переменной приводят к тому, что h1 будет только положительным, если V1 >= 300 и a_1 всегда будут 300, если V1 >= 300.Давайте сделаем то же самое для V2 соответственно

V2= a_2 + h_2
h_2 <= M b_2
500 b_2 <= a_2 <= 500  

Тогда функция стоимости будет

$1 * a_1 + $2 * h_1  + $3 * a_2 + $1.5 * h_2  
`

Позвольте мне заметить, что это решение может быть неверным на границах, например, когда V1=300, потому что тогда двоичная переменная b_1 может принять значение 0 и, следовательно, a_1=0, h_1>0.Однако эту проблему можно решить, если бы тома V1 и V2 всегда были целочисленными значениями, например, см. здесь

* Добавление к комментарию Дж. Доу :

если V1 является целым числом, тогда краевая задача будет рассматриваться как 301 b_1 <=V_1 <=301 (1-b_1)+ M b_1 вместо определяющего условия для b_1 выше.

Нет, h_1 < = M b_1 - a_1 недопустимопотому что это будет означать V1 = a_1 + h_1 <= M b_1, что будет означать V1 = 0, если V1 >=300 - что не соответствует действительности.

Да, h_1 - это избыточный объем над первой скобкой справа.

Если у нас более одной ценовой скобки, нам понадобятся еще две переменные: одна представляет сумму, представляющую объемДоля V1 между текущей ценовой категорией и следующей ценовой скобкой.Вторая переменная должна быть двоичной индикаторной переменной, которая равна 1, если объем V1 находится между текущей ценовой скобкой и следующей ценовой скобкой.

...