Вы не можете решить эту проблему с помощью стандартного алгоритма графа (например, 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.
Обратите внимание, что теперь проблема становится смешанной целочисленной линейной программой, а не просто линейнойПрограмма.