Вы можете представить это как смешанную целочисленную программу.
Предположим, у нас есть N
узлы, и что у каждого узла есть T
полных временных интервалов. Вы хотите найти назначение событий этим временным интервалам. Каждый узел имеет tn <= T
событий. Всего на вашем графике M
. Между любой парой узлов i
и j
, которые разделяют ребро, у вас есть коэффициент
c_ij = overlap_ij/tn
где overlap_ij
- количество перекрывающихся событий.
Пусть x[i,t]
- двоичная переменная, определенная как
x[i,t] = { 1 if an event occurs at time t in node i
= { 0 otherwise.
Тогда ограничение, что tn
события происходят в узле i
, может быть записано как:
sum_{t=1}^T x[i,t] == tn
Пусть e[i,j,t]
- двоичная переменная, определенная как
e[i,j,t] = { 1 if node i and node j share an event a time t
= { 0 otherwise
Пусть N(i)
обозначает соседей узла i
. Тогда у нас есть это в каждый раз t
sum_{j in N(i)} e[i,j,t] <= x[i,t]
Это говорит о том, что если общее событие происходит в соседнем узле i
во время t
, то у узла i
должно быть событие во время t
. Кроме того, если у узла i
есть два соседа u
и v
, у нас не может быть e[i,u,t] + e[i,v,t] > 1
(это означает, что два события будут совместно использовать один и тот же временной интервал), потому что сумма по всем соседям меньше x[i,t] <= 1
.
Мы также знаем, что должно быть overlap_ij = tn*c_ij
перекрывающихся событий между узлом i
и узлом j
. Это означает, что у нас есть
sum_{t=1}^T e[i,j,t] == overlap_ij
Собрав все это вместе, вы получите следующее MIP
minimize 0
e, x
subject to sum_{t=1}^T x[i,t] == tn, for all nodes i=1,...,N
sum_{j in N(i)} e[i,j,t] <= x[i,t],
for all nodes i=1,...,N and all time t=1,...,T
sum_{t=1}^T e[i,j,t] == overlap_ij for all edges (i,j)
between nodes
x[i,t] binary for i=1,...,N and t=1,...,T
e[i,j,t] binary for all edges (i,j) and t=1,...,T
Здесь цель равна нулю, так как ваша модель - это чисто технико-экономическая проблема. Эта модель имеет в общей сложности T*N + M*T
переменных и N + N*T + M
ограничений.
MIP-решатель, такой как Gurobi , может решить вышеупомянутую проблему или доказать, что она неосуществима (то есть решение не существует). Gurobi имеет интерфейс к R.
Вы можете извлечь окончательный временной ряд событий для i
-го узла, посмотрев на вектор решения x[i,1], x[i,2], ..., x[i,T]
.