Сопоставление двух элементов (людей) вместе на основе сходства предпочтений

Я нахожусь на стадии планирования веб-сайта, который будет периодически сопоставлять двух пользователей.

У каждого человека в пуле будет несколько предпочтений, которые используются в процессе сопоставления, например. какие жанры музыки им нравятся и в какие дни недели они доступны. Для целей этого проекта я хотел бы назначить более высокий приоритет веса/соответствия, если предпочтения специфичны; то есть два человека, которым нравится ТОЛЬКО «научная фантастика», лучше подходят, чем просто собрать вместе двух человек, которые отметили «все вышеперечисленное». Я думаю, что стандартный жадный алгоритм сопоставления, вероятно, сработает, но есть ли более эффективный алгоритм?


person CoderMD666    schedule 17.11.2011    source источник
comment
Вам нужно дать функцию оценки для всего сопоставления. Предположим, у вас есть 4 человека, которые лучше подходят друг другу: (1) одна пара отлично подходит, другая ужасно плохая. (2) обе пары имеют среднее соответствие   -  person amit    schedule 18.11.2011
comment
Я хотел бы попытаться максимизировать количество пар. Пока совпадение «приемлемо», это будет нормально для этого проекта. Как мне написать такую ​​функцию оценки?   -  person CoderMD666    schedule 18.11.2011
comment
см. редактирование моего ответа. Эта задача известна как задача максимального соответствия и является NP-сложной, поэтому эвристическое решение, вероятно, является лучшим вариантом.   -  person amit    schedule 18.11.2011


Ответы (1)


Это не так просто, вам нужно создать служебную функцию, которая позволит вам узнать, какое соответствие лучше. Например, что будет лучше:
(1) одна пара с отличным соответствием, другая ужасно плохая.
(2) две пары со средним совпадением.

Я предлагаю использовать некоторые хорошо зарекомендовавшие себя инструменты искусственного интеллекта для решения этой проблемы.
во-первых, некоторые определения:

  • P={all persons}
  • S={all possibilities to match all people}
  • пусть u:PxP->R будет функцией оценки для пары: u(p1,p2)=their score as a match [конечно, зависит от ваших данных]
  • пусть U:S->R будет функцией оценки для всего сопоставления: U(aMatch) = Sigma(u(p1,p2)) for each paired couple.
  • пусть next:S->2^S будет: next(S)={all possible matchings which are different from S by swapping two people only}

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

Самый крутой подъем на гору [SAHC] прост, начните со случайного сопоставления и вносите небольшие изменения, пока не достигнете точки, когда вы не сможете внести локальное улучшение. Эта точка является локальным максимумом и кандидатом на лучшее решение. перезапустить процесс с другим начальным состоянием.
псевдокод:

1. best<- -INFINITY
2. while there is more time
3. choose a random matching
4. NEXT <- next(s)
5. if max{ U(v) | for each v in NEXT} < U(s): //s is a local maximum
   5.1. if u(s) > best: best <- u(s) //if s is better then the previous result - store it.
   5.2. go to 2. //restart the hill climbing from a different random point.
6. else:
   6.1. s <- max { NEXT }
   6.2. goto 4.
7. return best //when out of time, return the best solution found so far.

Примечание 1: этот алгоритм работает в любое время, а это значит, что он будет улучшаться. результаты, поскольку вы даете ему больше времени. и если ваше время-> бесконечность, алгоритм в конечном итоге найдет оптимальное решение.
Примечание 2. вспомогательная функция U — это всего лишь предложение, вы также можете использовать max{u(p1,p2) | for each pair in the match} или любую другую вспомогательную функцию, которая вам подходит.

EDIT:
Даже более простая проблема, а именно: два человека могут просто "соответствовать" или "не совпадать" [u(p1,p2)=0 или u(p1,p2)=1], на самом деле задача максимального соответствия, которая NP-Hard, поэтому для этой задачи не существует известного полиномиального решения, и, вероятно, следует использовать эвристическое решение, подобное предложенному выше.
Обратите внимание, что если ваш график двудольный [т.е. вы не можете сопоставить мужчину с мужчиной/женщину с женщиной], эта проблема решается за полиномиальное время. Дополнительная информация: сопоставление в двудольных графах

person amit    schedule 17.11.2011
comment
Максимальное сопоставление, даже с весами в недвудольных графах, на самом деле может быть решено за полиномиальное время с использованием, например, алгоритма сопоставления Эдмондса. Минимальное максимальное соответствие — это поиск максимального соответствия (то есть такого, в котором нельзя добавить ни одного ребра) минимального размера. На самом деле это не имеет никакого отношения к рассматриваемой проблеме. - person Falk Hüffner; 10.12.2011