Прежде всего, это сложная задача NP - например, любой алгоритм, который может решить вашу проблему, может решить проблему Longest Path взвешенного графа следующим образом:
- Каждая вершина графа - это человек
- Любое ребро графа может быть закодировано путем создания нового хобби, которое разделяют только две вершины / лица ребра
(Может быть, более простое сокращение до NP-полной задачи, но я думаю, что это подойдет).
Скиена предложит Имитация отжига , начните с любого устройства и сделайте случайный выбор. Хитрость заключается в постепенном снижении вероятности того, что вы примете ухудшающееся изменение (таким образом, в начале вы даете ему некоторую свободу избегать локальных оптимумов, но постепенно он «остывает» и стабилизируется в некоторой области и делает небольшие уточнения). Вы также можете запустить его несколько раз и сохранить лучшее решение.
Вы, вероятно, можете написать что-то менее изощренное в том же духе. Я полагаю, что ваши проблемы будут небольшими, поэтому вы обязательно найдете хорошие решения, если попытаетесь набрать многих из них (и попытаться их случайно уточнить).
Конечно, если ваши проблемы очень малы, вы можете просто перечислить все перестановки и найти наилучшее решение. (Если у вас n
человек, убедитесь, что вы фиксируете положение кого-то и генерируете перестановки только для n - 1
людей).