Альтернативный подход состоит в том, чтобы рассматривать это как систему ограничений.Такая проблема может быть решена с помощью решателя ограничений.Эту проблему иногда называют проблемой социального игрока в гольф (Google найдет много ссылок).Математическая модель может выглядеть следующим образом:
Индексы:
t in {A,..,I} (team)
r in {round1,..,round4}
m in {match1,..,match3}
Двоичная переменная:
x(r,m,t) in {0,1} (indicates if team t plays in round r, match m)
Ограничения:
sum(m,x(r,m,t)) = 1 for all r,t (team plays exactly once in a round)
sum(t,x(r,m,t)) = 3 for all r,m (three teams in a match)
sum((r,m), x(r,m,t1)*x(r,m,t2)) <= 1 for all t1<t2 (teams play once in same match)
Это может бытьрешается с помощью решателя ограничений или MIQCP (смешанного целочисленного квадратично-зависимого программирования).(В последнем случае добавьте фиктивную цель).Последнее квадратичное ограничение может быть линеаризовано, и в этом случае мы также можем решить его с помощью решателя линейного MIP (Mixed Integer Programming).
Мое решение выглядит так:
---- 33 VARIABLE x.L
A B C D E F G H I
round1.match1 1 1 1
round1.match2 1 1 1
round1.match3 1 1 1
round2.match1 1 1 1
round2.match2 1 1 1
round2.match3 1 1 1
round3.match1 1 1 1
round3.match2 1 1 1
round3.match3 1 1 1
round4.match1 1 1 1
round4.match2 1 1 1
round4.match3 1 1 1