Мы можем записать это как математическую задачу оптимизации:
Скажем, у нас есть игроки i=1..24
и команды j=1,2
. Введите переменные решения:
x(i,j) = 1 if player i is assigned to team j
0 otherwise
Тогда мы можем написать:
Min |avg(2)-avg(1)|
subject to
sum(j, x(i,j)) <= 1 for all i (a player can be assigned only once)
sum(i, x(i,j)) = 6 for all j (a team needs 6 players)
avg(j) = sum(i, rating(i)*x(i,j)) / 6 (calculate the average)
avg(j) >= 0
Мы можем линеаризовать абсолютное значение в задаче:
Min z
subject to
sum(j, x(i,j)) <= 1 for all i
sum(i, x(i,j)) = 6 for all j
avg(j) = sum(i, rating(i)*x(i,j)) / 6
-z <= avg(2)-avg(1) <= z
z >= 0, avg(j) >= 0
Теперь это задача линейного смешанного целочисленного программирования. Решатели MIP легко доступны.
Используя некоторые случайные данные, я получаю:
---- 43 PARAMETER r ELO rating
player1 1275, player2 1531, player3 1585, player4 668, player5 1107, player6 1011
player7 1242, player8 1774, player9 1096, player10 1400, player11 1036, player12 1538
player13 1135, player14 1206, player15 2153, player16 1112, player17 880, player18 850
player19 1528, player20 1875, player21 939, player22 1684, player23 1807, player24 1110
---- 43 VARIABLE x.L assignment
team1 team2
player1 1.000
player2 1.000
player4 1.000
player5 1.000
player6 1.000
player7 1.000
player8 1.000
player9 1.000
player10 1.000
player11 1.000
player17 1.000
player18 1.000
---- 43 VARIABLE avg.L average rating of team
team1 1155.833, team2 1155.833
---- 43 PARAMETER report solution report
team1 team2
player1 1275.000
player2 1531.000
player4 668.000
player5 1107.000
player6 1011.000
player7 1242.000
player8 1774.000
player9 1096.000
player10 1400.000
player11 1036.000
player17 880.000
player18 850.000
sum 6935.000 6935.000
avg 1155.833 1155.833
Удивительно, но для этого набора данных мы можем найти идеальное совпадение.