Можно использовать метод отжига или генетический алгоритм (про них можно почитать в википедии или поискать статью на Хабр). По сути оба алгоритма решают задачу максимизации/минимизации какой-либо функции.
Например можно ввести метрику того, насколько какое-то решение "хорошее". Пусть f(p) - сумма по всем парам id (обозначим их как i и j) значения weiht(i, j) / |i - j|
, где weiht(i, j)
- то, насколько i "хочет быть ближе" к j, а |i - j|
- минимальное расстояние между i и j в кольце. Здесь p - перестановка id. Тогда решение задачи - p, при которой f(p) - максимально.
К сожалению, есть одна проблема: отжиг и/или генетический алгоритм могут не сработать, но есть вероятность что в этой задаче они помогут. Не попробуешь - не узнаешь)