Алгоритм рассадки людей с наиболее распространенными увлечениями - PullRequest
4 голосов
/ 08 августа 2010

Мои данные о людях и увлечениях, с отношениями "многие ко многим". У каждого человека есть хотя бы одно хобби.

Мне нужно найти способ расставить всех людей за N столами так, чтобы между людьми за каждым столом было максимальное количество общих увлечений. Не обязательно, чтобы у каждого стола было хотя бы одно общее хобби между всеми людьми, сидящими за ним. Кроме того, таблицы не обязательно должны быть полностью заполнены.

Любые идеи будут высоко оценены.

1 Ответ

2 голосов
/ 08 августа 2010

Прежде всего, это сложная задача NP - например, любой алгоритм, который может решить вашу проблему, может решить проблему Longest Path взвешенного графа следующим образом:

  • Каждая вершина графа - это человек
  • Любое ребро графа может быть закодировано путем создания нового хобби, которое разделяют только две вершины / лица ребра

(Может быть, более простое сокращение до NP-полной задачи, но я думаю, что это подойдет).

Скиена предложит Имитация отжига , начните с любого устройства и сделайте случайный выбор. Хитрость заключается в постепенном снижении вероятности того, что вы примете ухудшающееся изменение (таким образом, в начале вы даете ему некоторую свободу избегать локальных оптимумов, но постепенно он «остывает» и стабилизируется в некоторой области и делает небольшие уточнения). Вы также можете запустить его несколько раз и сохранить лучшее решение.

Вы, вероятно, можете написать что-то менее изощренное в том же духе. Я полагаю, что ваши проблемы будут небольшими, поэтому вы обязательно найдете хорошие решения, если попытаетесь набрать многих из них (и попытаться их случайно уточнить).

Конечно, если ваши проблемы очень малы, вы можете просто перечислить все перестановки и найти наилучшее решение. (Если у вас n человек, убедитесь, что вы фиксируете положение кого-то и генерируете перестановки только для n - 1 людей).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...