Это отличается от расширения проблемы стабильного брака, поскольку, как я понимаю вопрос ОП, у людей в каждой группе нет упорядоченного списка тех, с кем они хотят работать, от большинства к минимуму; это бинарные отношения (хочет / не хочет).
Это можно сформулировать как задачу целочисленного программирования, которая может быть решена довольно быстро. Я даю математическую формулировку проблемы ниже; для обработки данных вы можете использовать такой пакет, как glpk или AMPL / CPLEX.
Определите следующие матрицы:
M1 = |A| x |B|
матрица, где
M1(a,b) = 1
, если a (данный член A) готов работать с b (данный член B), и 0 в противном случае
M2 = |A| x |C|
матрица, где M2(a,c) = 1
, если a (данный член A) готов работать с c (данный член C), и 0 в противном случае
M2 = |B| x |C|
матрица, где
M3(b,c) = 1
, если b (данный член B) готов работать с c (данный член C), и 0 в противном случае
Теперь определите новую матрицу, которую мы будем использовать для нашей максимизации:
X = |A| x |B| x |C|
матрица, где
X(a,b,c) = 1
, если мы заставим a, b и c работать вместе.
Теперь определим нашу целевую функцию:
// Максимальное количество групп
увеличить Sum[(all a, all b, all c) X(a,b,c)]
с учетом следующих ограничений:
// Чтобы никто не попал в две группы
Для всех значений: Sum[(all j, k) X(a, j, k)] <= 1
Для всех значений b: Sum[(all i, k) X(i, b, k)] <= 1
Для всех значений c: Sum[(all i, j) X(i, j, c)] <= 1
// Для обеспечения того, чтобы все группы состояли из совместимых лиц
Для всех а, б, в: X(a,b,c) <= M1(a,b)/3 + M2(a,c)/3 + M3(b,c)/3