Существует не вероятностный (анонимный) алгоритм выбора лидера с обоими, гарантированное прекращение и гарантированная правильность (только один лидер). Если я правильно помню, вы найдете доказательство в книге Н. Линча о распределенных системах.
Однако существуют алгоритмы с пределом вероятности нуля для не-завершения для достаточной продолжительной работы алгоритма. Кроме того, ожидаемое время выполнения довольно короткое (AFIR, в порядке ln (k) для k инициаторов).
Основная идея такого алгоритма следует за вашим вторым подходом. Однако, не просто перезапустите процесс в случае нескольких лидеров, но только позвольте победителям последнего раунда стать кандидатами в следующем раунде.
EDIT 1-3:
Если вы просите неанонимный лидер выборов, есть несколько вероятностных алгоритмов, которые гарантируют завершение. Например, возьмите алгоритм нормального кольца и сообщите сообщения с определенной вероятностью, так как меньший идентификатор, как больше вероятность задержки. Таким образом, сообщения с низкой вероятностью выигрыша стираются раньше, что приводит к уменьшению общего количества сообщений.
Если вы хотите иметь другой результат для не-анонимных членов, вы можете, например, использовать алгоритм две фазы:
- Выполнение классического лидера выборов => а узлы А с самым высоким ID выигрывает
- Пусть рулон кубик, чтобы определить фактический лидер.
Элемент случайности также может быть распределен:
- Любых узлов знает множество идентичностей (S) (если нет, то использовать алгоритм затопления сказать)
- Всех узлов выбрать случайно идентификатор ouf S и отправить его на любой другой узел
- Идентификатор, который называется чаще всего, выигрывает. Если имеется более одного такого идентификатора, выберите один из них детерминированным способом, например, медиана.
Прекращение и неопределенный результат предоставляются для обоих алоритов. Тем не менее, первый имеет более низкую среднюю сложность сообщения (пжурналап против n², в худшем случае сложность такой же) и более справедливой (то есть вероятность того, что ID выигрывает в equaly распределяется , что не соответствует второму алгоритму). Я уверен, что по крайней мере последний недостаток можно устранить с помощью более сложного алгоритма, но вопрос здесь заключался в общем существовании такого алгоритма.
Я не уверен, полностью ли я понимаю вопрос, но можете ли вы назначить случайное число узлам, наивысший/самый низкий - лидер? – vlad
Рассматривайте каждого кандидата как карту в колоде игральных карт, затем перетасовывайте колоду и берете человека сверху как лидера? Перетасовка колоды карт может быть сделана как (распределенная, так и криптографически) (http://en.wikipedia.org/wiki/Mental_poker#Shuffling_cards_using_commutative_encryption). –
Уважаемый Влад, это не имеет смысла, так как если бы я это сделал, тогда он будет делать то же самое, что «присваивать идентификаторы процессов» всем процессам. Дорогой Голубой Раджа, я не могу этого сделать, потому что нет «общей» власти «перетасовывать» карты. Все узлы запускаются в одно и то же время и знают друг о друге (поскольку они могут отправлять им сообщения), однако они должны сами решить, как выбрать лидера (все они имеют один и тот же код кстати). – Snowflake