Это можно сформулировать как целочисленную задачу программирования.
Определить двоичную переменную A[i,g,t] = 1
, если персона i in N
принадлежит группе g in G
в момент времени t in T
и 0
в противном случае.Тогда M[i,j] = sum(A[i,g,t] * A[j,g,t] for g in G, t in T)
равно 1
, если i
и j
встретятся.
Скажем, вы хотите максимизировать количество пар людей, которые встречаются хотя бы один раз.Затем ваша цель становится sum(M[i,j] for i, j in N)
.
Вы можете выразить свои ограничения линейно:
- Размеры группы ограничены:
forall g in G, forall t in T, sum(A[i,g,t] for i in N) <= quota[g,t]
. - Каждому человеку назначаетсяровно одной группе в каждый период:
forall i, forall t, sum(A[i,g,t] for g in G) = 1
.
Существует несколько решателей с открытым исходным кодом, которые должны хорошо работать в предложенном вами масштабе.