Можно ли выразить это конкретное ограничение линейной программы?

Спасибо за ваше время.

У меня есть линейная программа, и я понятия не имею, как я могу выразить форму ограничения, и даже если это возможно. Может здесь кто знает решение.

Компания собирает и продает смесь, состоящую из 3 ингредиентов, a, b и c, где a = b = c.
Каждый ингредиент может поступать с 2 заводов: f1 и f2.
Стоимость каждого ингредиента колеблются в течение дня и различны для каждой фабрики.
Каждая фабрика предоставляет стоимость каждого ингредиента в виде списка пар: (стоимость, доступная сумма).

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

Например, в момент времени t затраты могут быть:

- for ingredient a :  
f1 : (10$, 5.1), (11$, 10.2), (13$, 20.5)  
f2 : (11$, 1.), (12$, 15.2), (13$, 6.9)  
- for ingredient b :  
f1 : (15$, 8.3), (16$, 20.), (18$, 10.7)  
f2 : (15$, 4.2), (16$, 15.1), (18$, 19.3)  
- for ingredient c :  
f1 : (31$, 2.), (34$, 3.5), (37$, 14.9)  
f2 : (30$, 4.7), (32$, 9.2), (35$, 12.4) 

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

Результирующее решение, состоящее из сумм для каждой стоимости, будет в выходных переменных:

amountAF1_1, amountAF1_2, amountAF1_3  
amountAF2_1, amountAF2_2, amountAF2_3  
amountBF1_1, amountBF1_2, amountBF1_3  
amountBF2_1, amountBF2_2, amountBF2_3  
amountCF1_1, amountCF1_2, amountCF1_3  
amountCF2_1, amountCF2_2, amountCF2_3  

Например, используя предоставленные данные примера и для входных данных maxAllowedQuantity = 15 (без ограничения maxAllowedCost, потому что я не знаю, как его сформулировать, и это то, о чем я спрашиваю), на основе некоторых целей на данный момент (например: я предпочитаю чтобы по справедливости разделить суммы между фабриками при одинаковой общей стоимости и не отдавать предпочтение одной фабрике),
я мог бы получить:

amountAF1_1 = 5.1, amountAF1_2 = 4.9, amountAF1_3 = 0.  
amountAF2_1 = 0., amountAF2_2 = 5., amountAF2_3 = 0.  
amountBF1_1 = 5., amountBF1_2 = 0., amountBF1_3 = 0.  
amountBF2_1 = 4.2, amountBF2_2 = 5.8, amountBF2_3 = 0.  
amountCF1_1 = 2., amountCF1_2 = 3.5, amountCF1_3 = 2.  
amountCF2_1 = 4.7, amountCF2_2 = 2.8, amountCF2_3 = 0.  

Что я могу обобщить с точки зрения затрат:

5.1a at 10$, 4.9a at 11$, 5.0a at 12$,  
9.2b at 15$, 5.8b at 16$,  
4.7c at 30$, 2.0c at 31$, 2.8c at 32$, 3.5c at 34$, 2.0c at 37$

Если мы разложим полученные смеси по стоимости, мы получим:

4.7 mixtures at 10 + 15 + 30 = 55$,  
0.4 mixtures at 10 + 15 + 31 = 56$,  
1.6 mixtures at 11 + 15 + 31 = 57$,  
2.5 mixtures at 11 + 15 + 32 = 58$,  
0.3 mixtures at 11 + 16 + 32 = 59$,  
0.5 mixtures at 11 + 16 + 34 = 61$,  
3.0 mixtures at 12 + 16 + 34 = 62$,  
2.0 mixtures at 12 + 16 + 37 = 65$, 

Здесь максимальная стоимость составляет 65 долларов.
Но если моя цена продажи составляет 60 долларов, чтобы не потерять деньги:
Как я могу добавить ограничение maxAllowedCost = 60 долларов?

Примечание: мы не можем просто взять предыдущий результат (без ограничения maxAllowedCost) и удалить суммы при затратах > 60 $, потому что моя целевая функция даст другое перераспределение для количеств при затратах ‹ = 60, если общее количество меньше: здесь 9,5 (15 - 0,5 - 3,0 - 2,0) вместо 15 ранее.
...

Спасибо




Ответы (1)


Позвольте мне переформулировать ваш вопрос. Каждая фабрика f предоставляет вам список предложений (пар цена-количество) для i ингредиента. Запишем (и проиндексируем) jth ставку как

 (price[j, f, i], quantity[j, f, i])

Похоже, ваша цель — решить, какие ставки принять, с учетом ограничений на получение прибыли.

Пусть x[j, f, i] представляет количество j ингредиента i, которое вы покупаете на фабрике f. Вы не можете купить отрицательное количество ингредиента, и вы не можете купить больше, чем количество, которое фабрика предлагает в этом предложении, поэтому у нас есть

 0 <= x[j, f, i] <= quantity[j, f, i] for all j, f, i

xs — это ваши переменные решения.

Стоимость, которую вы платите за принятие jй ставки, составляет price[j, f,i] * x[j, f, i].

Таким образом, общая стоимость, которую вы платите всем фабрикам за ингредиенты, равна

sum_{j, f, i} price[j, f, i]*x[j, f, i]

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

m <= sum_{j, f} x[j,f,i] for all i

Вы зарабатываете 60 долларов (скажем) за продажу одной единицы смеси. Таким образом, ваш доход равен 60*m.

Прибыль, которую вы получаете, является доходом - затратами или

60*m - sum_{j, f, i} price[j, f, i]*x[j, f, i]

Чтобы убедиться, что производственные затраты меньше или равны вашей продажной цене, вы просто гарантируете, что ваша прибыль неотрицательна. Или

60*m - sum_{j, f, i} price[j, f, i]*x[j, f, i] >= 0

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

Для этого пусть y[f] представляет количество, купленное на заводе f. Затем

y[f] == sum_{j, i} x[j, f, i]  for all f

Для каждой пары фабрик f1, f2 мы можем вычислить разницу в закупленном количестве как z[f1, f2], где

z[f1, f2] >= y[f1] - y[f2]  for all factory pairs (f1, f2)
z[f1, f2] >= y[f2] - y[f1]  for all factory pairs (f1, f2)

Это дает нам следующую линейную программу

minimize      -p + sum_{all factory pairs f1, f2}  z[f1, f2]
x,m,y,z,p

subject to    p == 60*m - sum_{j, f, i} price[j, f, i]*x[j, f, i]
              y[f] == sum_{j, i} x[j, f, i] for all f
              m <= sum_{j, f} x[j, f, i] for all i
              z[f1, f2] >= y[f1] - y[f2] for all factory pairs (f1, f2)
              z[f2, f1] >= y[f2] - y[f1] for all factory pairs (f1, f2)
              x[j, f, i] <= quantity[j, f, i] for all j, f, i                   
              0 <= x[j, f, i] for all j, f, i
              0 <= m
              0 <= y[f] for all f
              0 <= p
person codehippo    schedule 29.10.2014
comment
большое спасибо за ответ - person infiniteLoop; 07.11.2014