Мне нужно устроить рабочих на работу для данной смены. Рабочие устанавливают порядок предпочтений относительно того, на какую работу они хотят работать. Работники с наименьшим количеством часов получают первое предпочтение на работе. Только один работник может выполнять определенную работу.
Я попытался решить эту проблему, создав зубчатый массив. Массив отсортирован по рабочим с наименьшим количеством часов. Каждый вложенный массив представляет собой определенный список предпочтений работников. Числа в массиве - это код задания. Затем я генерировал перестановки, пока не получил правильное решение.
Например, ниже приведен список из 28 работников вместе с предпочтениями работы каждого работника.
int[][] preference = {
new int[] {1,2,3,4,5,6,7,8,11,12,13,14,15},
new int[] {2,4,5,6,7,8,11,12,13,14,15},
new int[] {1,3,6,7,8,9,10,14,15,18,19,22,23,24,26,27,29,30,32,34,35,25,36},
new int[] {4,5,12,13},
new int[] {9,10,11,14,15,1,2,6},
new int[] {9,10,11,14,2,6,18,19,27,29,30,31,32,35},
new int[] {11,12,13,14,2,4,5,6},
new int[] {12,13,4,5},
new int[] {9,10,11,13,14,15,1,2,6,7,8,18,19,21,22,23,24,26,27,28,29,30,31,32,34,35,16,17,33,36},
new int[] {1,2,9,10,11,14,15,18,19,30,31,32,35,37,33},
new int[] {4,13,18,19,35},
new int[] {18,19,35},
new int[] {21,22,23,24,18,19},
new int[] {22,23,24,25,18,19,16,17},
new int[] {18,19,23,24,35},
new int[] {18,19,23,24,35},
new int[] {27,26,28,29,30,32,34,35,36},
new int[] {27,26,30,32,34,35,36},
new int[] {28,29,30,31,32,33,35},
new int[] {28,29,30,31,32,33,26,35,36},
new int[] {26,29,30,31,32,34,35,36},
new int[] {28,29,31,32,33,26,35,36},
new int[] {27,28,29,30,31,32,35,33,1,2,3,9,10,11,14,18,19,6,15},
new int[] {34,35,36,26,27,31,32},
new int[] {31,32,34,35,2,11,14,18,19,23,24,6,15,16,17,20},
new int[] {37,29,30,31,32,35,33,36,2,9,10,11,14,18,19,23,24,6,15,16,17},
new int[] {18,19,35},
new int[] {18,19,35},
};
preference[0]
содержит первый список предпочтений работников. prererence[1]
содержит второй список предпочтений рабочих и т. Д. В этом примере первый работник выбрал для работы 1,2,3,4,5,6,7,8,11,12,13,14,15
.
Правильное решение будет: 1,2,3,4,9,10,11,12,14,15,13,18,21,22,23,24,27,26,28,29,30,31,32,34,6,37,19,35
.
У меня проблема с производительностью. Я пытался выполнять итерации с использованием как рекурсивных, так и нерекурсивных циклов, и производительность ужасна. Я думаю, что должен быть другой подход к решению проблемы или библиотека, которая уже делает это, что я мог бы купить. Заранее спасибо за любую помощь.