Лучше такой алгоритм (модификация предыдущего).
Если надо минимизировать сумму

, где

, то пишите матрицу

из этих перестановок, далее цикл: выбираете

и вычисляете еще строку

, после чего числа

сортируете в порядке, противоположном порядку

. И так последовательно для всех строк (возможно несколько раз). Цикл прекращается, когда для всех

уже не изменяются.
Для пространства величиной порядка

алгоритм довольно быстро загоняет сумму в локальный минимум. Опять же легко программируется. Причем очень много локальных минимумов, которые одновременно являются и глобальными. В то же время, чем меньше делителей имеет

, тем, скорее всего, больше шагов до локального минимума и меньше глобальных минимумов. Точнее не могу сказать.
Для

(наш случай) у меня получилось

. Проверьте, пожалуйста.