Проблема оптимизации цепочки поставок с CVXPY и CBC

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

Рассмотрим в качестве примера типичную задачу оптимизации цепочки поставок:

  1. Есть товар, который заказывают клиенты A, B, C.

  2. Спрос на этот товар составляет 100, 200 и 100 шт. Соответственно (общий спрос - 400 шт.).

  3. В наличии 250 шт. (Следовательно, нехватка 150 шт.).

  4. Каждый покупатель платит за товар одинаковую цену (10 долларов за товар).

  5. Цель состоит в том, чтобы распределить этот продукт между покупателями таким образом, чтобы доход был максимальным.

  6. Поскольку цены за единицу идентичны, существует несколько возможных решений / альтернатив распределения, что приводит к оптимальному значению целевой функции в 2500 долларов США (т. Е. Общее распределение, умноженное на цену за единицу).

Есть ли способ передать в качестве параметра решателю (например, CBC или cvxpy), какую из альтернатив распределения следует выбрать? По умолчанию решающая программа выполняет распределение по принципу «первым пришел - первым обслужен», тогда как предполагаемое распределение пропорционально спросу.

Будем очень признательны за вашу помощь и содействие.


person Mike Martley    schedule 03.02.2021    source источник
comment
Да и нет. Вкратце: не делайте этого (например, настраиваемое ветвление: невероятно сложно на Cbc низкого уровня; невозможно в cvxpy). Добавьте к своей цели что-нибудь, что разделяет лучшие и худшие варианты решений (например, objective = default-objective + 0.01 * tie-breaking-objective). Это делается постоянно и дает решателю достаточно свободы для использования умного ветвления (производительности). Примечание: По умолчанию решающая программа распределяет по принципу «первым пришел - первым обслужен» - это ваша догадка, и это не гарантируется!   -  person sascha    schedule 03.02.2021
comment
Есть ли конкретный код или случай для этого?   -  person Rafael Valero    schedule 07.02.2021


Ответы (1)


Думаю, это можно сформулировать как многокритериальную проблему:

  1. Минимизировать затраты
  2. Постарайтесь максимально приблизиться к удовлетворению единственной доли спроса.

Это можно решить в два этапа:

  1. Решите для цели 1.
  2. Добавьте цель 1 как ограничение к проблеме и решите задачу 2.

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

Это похоже на то, что @sascha предложил в комментариях.

person Erwin Kalvelagen    schedule 03.02.2021