2011-04-02 2 views
3

Моя проблема: я хочу сделать «добрый» лотерейный процесс. Этот алгоритм будет распределять призы равномерно, если это возможно. Это можно считать несправедливым для людей, которые покупают билет на каждый приз, поскольку он будет более гибким, чтобы выиграть непопулярные призы, но неважно, что мы можем сказать, что призы примерно одинаковы. Алгоритм поможет убить дисперсию и уменьшить дисеролинг, чтобы выиграть призы. (Да, расточка)Алгоритм равномерного распределения лотереи «призы»/без дисперсии

У меня будет N конкурсов, Вы могли бы получить приз. Лица, M, могут купить билет на каждые N.

Так пример, вот призы и люди, которые купили билеты:

Prize1=[Pete,Kim, Jim] 
Prize2=[Jim, Kim] 
Prize3=[Roger, Kim] 
Prize4=[Jim] 

Там 4 призы и 4 уникальных имен, поэтому оно должно быть возможным распределить его равномерно.

Пример может быть прост в разрешении, вы должны найти его через 15 секунд, но когда M и N увеличить, это становится намного хуже.

Я пытаюсь сделать общий алгоритм, но это сложно. Мне нужны хорошие советы или даже лучшее решение или ссылка на решение.

+0

Слово, которое вы ищете, это «приз», а не «цена», просто чтобы вы знали. Я немного смутил меня. – Phoenix

+0

Итак, как вы должны распределять призы? – quasiverse

+0

Присвоение призов, которые они могут выиграть, поэтому каждый может выиграть х призов каждый - остальные должны быть распределены случайной лотереей. –

ответ

0

Вы хотите найти алгоритм задания или венгерский алгоритм, например, взвешенное идеальное совпадение в двудольном графе или, возможно, алгоритм all-pair floyd warshall. Моя идея состоит в том, что это может представлять собой двудольный граф. Это непростая задача.

+0

Спасибо, я согласен с тобой, я придумал грубое решение, которое сосало, ха-ха. Эффективные процессоры делают нас глупыми: D –

1

Теория: У вас есть Bipartite graph. Вы должны найти Perfect matching. Существует идеальное соответствие на графике, если:

Если совершенное паросочетание существует, то вы можете запустить Hungarian algorithm, чтобы найти его.

+0

Спасибо за помощь. Я оказался просто грубым, заставляя мой путь к разрешению. Веб-сервер работает быстро, а m и n не такие большие :) Решение настолько плохое, что оно смешно, im бомбардируя его случайными числами, пока оно не соответствует моим критериям, думаю, я программирую его лучше, когда у меня есть время :-) –

+0

FYI : вы не можете решить эту проблему с помощью bruteforce, если n> ~ 30. – erenon

Смежные вопросы