Минимальный поток затрат с минимальными инвестиционными затратами

Я хочу использовать Python Min-Cost Flow решатель, чтобы иметь возможность строить новые сети. Это означает, что у меня есть исходный полный граф с вершинами, являющимися либо поставщиками, либо имеющими спрос. Использование алгоритма должно сказать мне, исходя из их стоимости, какие грани будут использоваться для удовлетворения всех требований. В отличие от существующих проблем, стоимость ребра при использовании описывается не только удельной стоимостью, но также имеет вложение этого ребра, которое не зависит от потока. Я изучал исходный код networkx и or-tools, но не могу понять, как адаптировать их для реализации инвестиционных затрат по краям. У кого-то есть идея получше или я могу помочь адаптировать код?

С наилучшими пожеланиями, Юстус

1 ответ

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

https://developers.google.com/optimization/assignment/assignment_mip

Но вам нужно немного подправить: вам нужны два класса переменных решения: invest_var (двоичный) и flow_var (Непрерывное). Цель будет выглядеть так:

min: sum(flow_cost[i,j]*flow_var[i,j]) + sum(invest_cost[i,j]*invest_var[i,j])
And you need to add an additional constraint for each link:
flow_var[i,j] <= BIG_INT * invest_var[i,j]

Цель этого ограничить flow_var в 0 если invest_var является 0, Ограничения спроса и предложения будут такими же, как в примере.BIG_INT постоянная Вы можете установить его как:

BIG_INT=max(flow_upper_bound[i,j])

Где flow_upper_bound - это верхняя граница ваших переменных flow_var.

Обратите внимание, что теперь проблема становится смешанной целочисленной линейной программой, а не просто линейной программой.

Другие вопросы по тегам