Оптимизация перевозок в сотрудничестве с компаниями - Математическое моделирование - PullRequest
0 голосов
/ 26 октября 2019

Я прохожу курс, использующий математическое моделирование, и работаю над моделью для оптимизации транспортных маршрутов. В задаче нам даны наборы C (все транспортные компании в задаче), I (все точки поставки, доступные для всех компаний) и J (все точки спроса, доступные для всех компаний). Компании производят идентичный товар, поэтому существует возможность сотрудничества между компаниями для удовлетворения потребностей друг друга. Возможна любая комбинация точек предложения и точек спроса, и мы знаем, какие точки спроса / предложения принадлежат каждой компании (я полагаю, что здесь нет совпадений). Все потребности должны быть удовлетворены.

  • w (i, j) - это поток между точкой поставки i и точкой спроса j (количество единиц товара, транспортируемых за один рейс, по маршруту от i до j)
  • e (i, j) - удельная стоимость потока между точкой поставки i и точкой спроса j

. Я выяснил следующее:

Функция цели: Минимизация общей стоимости всех потоков между точкой поставки i и точкой спроса j

Ограничения:

Сумма всех потоков от точки поставки i до спросаточка j должна быть меньше или равна мощности подачи в точке i, для всех i в I

Сумма всех потоков от точки поставки i до точки спроса j должна равняться суммеспроса в точке спроса j, для всех j в J

И ограничение неотрицательности, которое предписывает, чтобы потоки для всех точек поставки i в точки спроса j были неотрицательными.

Однако есть дополнительные ограничения, которые у менятрудное моделирование (у меня нет предыдущего опыта математического моделирования до этого курса). Последнее требование заключается в том, что не более двух разных компаний должны предоставлять точки спроса другой компании, в дополнение к себе. Как бы я включил что-то подобное в модель? Моя путаница связана с тем фактом, что только две компании могут поставлять товары до точки спроса, если эти компании не включают компанию, эксплуатирующую точку спроса, и три компании, если оригинальная компания также поставляет. Например, компании A, B и C могут поставлять товары в точку спроса для компании A. Однако компании B, C и D не могут поставлять товары в эту же точку спроса. Есть ли способ включить этот тип индексации в проблему?

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

Заранее благодарен за любую помощь!

1 Ответ

0 голосов
/ 27 октября 2019

Моя путаница связана с тем фактом, что только две компании могут поставлять товары до точки спроса, если эти компании не включают в себя компанию, эксплуатирующую точку спроса, и три компании, если оригинальная компания также поставляет. Например, компании A, B и C могут поставлять товары в точку спроса для компании A. Однако компании B, C и D не могут поставлять товары в эту же точку спроса. Есть ли способ включить этот тип индексации в проблему?

Детали будут различаться в зависимости от того, как вы реализовали проблему, но вот пример того, как она может быть закодирована в AMPL. (У меня не было возможности протестировать этот код, поэтому он может быть немного ошибочным.)

Ключ использует информацию о владении точками спроса / предложения для определения суммы, которая не включает компании, поставляющиесвои собственные очки.

set SupplyPoints;
set DemandPoints;
set Companies;
set SupplyPointsByCompanies dimen 2 within {SupplyPoints,Companies};
# a set of (supply point, company) tuples. Following code assumes that
# each supply point has only one owning company.
set DemandPointsByCompanies dimen 2 within {DemandPoints,Companies};
# similarly for demand
param biggestsupply;
# to be defined as the largest value that any one point could supply to any other

var Supply{i in SupplyPoints, j in DemandPoints} >= 0;
# actual amount to be supplied from i to j
var PosSupply{i in SupplyPoints, j in DemandPoints} binary;
subject to DefinePosSupply{i in SupplyPoints, j in DemandPoints}: PosSupply[i,j]*biggestsupply >= Supply[i,j];
# forces PosSupply to equal 1 if Supply is non-zero

subject to limit_num_suppliers{(j,co) in DemandPointsByCompanies}:
    sum{j in SupplyPoints: (i,co) not in SupplyPointsByCompanies} PosSupply[i,j] <= 2;

В зависимости от масштаба переменных решения, вам может потребоваться поиграть с настройками допуска, чтобы избежать какой-то странности, когда PosSupply = 0, но biggestsupply * PosSupply считается ненулевым;подробности см. на этом форуме .

...