Оптимизация перевозок при сотрудничестве компаний - Математическое моделирование

Я изучаю курс математического моделирования и работаю над моделью для оптимизации транспортных маршрутов. В задаче нам даны наборы 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 не могут поставлять в эту же точку спроса. Есть ли способ включить этот тип индексации в проблему?

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

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


person user    schedule 26.10.2019    source источник


Ответы (1)


Меня беспокоит тот факт, что только две компании могут поставлять товары в точку спроса, если эти компании не включают компанию, обслуживающую точку спроса, и три компании, если исходная компания также поставляет. Например, компании 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 считается ненулевым; подробности см. в этом обсуждении на форуме.

person Geoffrey Brent    schedule 27.10.2019