@antares4045

Как отсортировать элементы на основании критерия совместимости?

Есть словарь (на самом деле js объект), в котором могут быть тысячи элементов. У каждого элемента есть набор не нормализованных "пожеланий" быть поближе к определённым узлам. что то вроде "я, id0, оцениваю желание быть поближе к элементу id1 в 10 баллов, к id9 в 123832 балла а к id5 в 8". Необходимо реорганизовать структуру в кольцо максимально учитывая пожелания близости (причём отмечу, что необходимо не просто подобрать соседей а именно учесть пожелание быть поближе: тоесть в данном примере id5 от id0 на противоположном конце кольца оказаться не должен).
Причём дополнительной сложностью является то, что задача (в идеале) должна решаться в браузере в рантайме, хотя при большой необходимости можно унести и на бэкенд.

Скорее всего, есть алгоритм, решающий задачи такого типа, но все мои попытки что-то нагуглить упираются в настойчивое желание гугла впарить мне qsort.

другими словами

{
    id0 : {
        weights: {
            id1: 10,
            id9: 123832,
            id5: 8
        }
    },
    id1: {
        weights: {
            id0 : 10
        }
    },
    id5: {
        weights: {
            id0 : 8
        }
    },
    id9 : {
        weights: {
            id0 : 123832
        }
    }
}

должно перобразовываться в любой из массивов
['id0', 'id9', 'id5', 'id1']
['id9', 'id5', 'id1', 'id0']
['id5', 'id1', 'id0', 'id9']
['id1', 'id0', 'id9', 'id5']

['id0', 'id1', 'id5', 'id9']
['id1', 'id5', 'id9', 'id0']
['id5', 'id9', 'id0', 'id1']
['id9', 'id0', 'id1', 'id5']
  • Вопрос задан
  • 142 просмотра
Решения вопроса 1
@luchinkinkos
олимпиадник недодатсаентист
Можно использовать метод отжига или генетический алгоритм (про них можно почитать в википедии или поискать статью на Хабр). По сути оба алгоритма решают задачу максимизации/минимизации какой-либо функции.
Например можно ввести метрику того, насколько какое-то решение "хорошее". Пусть f(p) - сумма по всем парам id (обозначим их как i и j) значения weiht(i, j) / |i - j|, где weiht(i, j) - то, насколько i "хочет быть ближе" к j, а |i - j| - минимальное расстояние между i и j в кольце. Здесь p - перестановка id. Тогда решение задачи - p, при которой f(p) - максимально.
К сожалению, есть одна проблема: отжиг и/или генетический алгоритм могут не сработать, но есть вероятность что в этой задаче они помогут. Не попробуешь - не узнаешь)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы