Истории

пятница, 8 февраля 2019 г.

Немного про метод Шульце

Сейчас, похоже, модно думать о методе Шульце, как о подходящем способе подсчёта голосов для нашего конкурса. Мне тоже стало интересно, и я решил немного разобраться.

Что не так сейчас?

В первую очередь, надо было понять, а что не так с тем способом голосования и подсчёта голосов, который используется сейчас: система баллов от 1 до 10 и подсчёт по среднему арифметическому.

Как показала практика (достаточно взглянуть на листинги голосов), голосующие не используют всю 10-балльную шкалу: часто какие-то оценки не используются -- и, более того, максимум и минимум отличаются от 10 и 1 соответственно.
    Что это означает? Могу сказать за себя и, представляю, что я здесь скорее подчиняюсь общему правилу, а не являюсь исключением (поправьте, если ошибаюсь): мы используем какие-то субъективные ориентиры, которые находятся за пределами конкурса, для того, чтобы понять, что такое игра на 1, а что такое -- на 10.
    В этом есть некоторая проблема: голоса, как выясняется, имеют не равный вес. Предположим, я голосую за две игры A и B, которые мне, по каким-то соображениям показались на 5 и 6, а другой -- ставит им же 10 и 1. Тогда по среднему арифметическому выходит, что побеждает игра А, а на деле я сказал, что игра A мне понравилась меньше игры B, а второй голосующий отдал предпочтения наоборот.
    Можно сказать, что он оценил игру B много хуже игры A, но это "много" -- у каждого своё. Текущий метод подсчёта голосов позволяет, в частности, более радикально настроенным голосующим больше влиять на голосование. Тогда неизбежно возникают ситуации, так насторожившие сообщество на последнем КРИЛе: когда влияние группы голосующих с очень отличающимися и радикальными вкусами переворачивает всё голосование.
   Поэтому, если и использовать текущую систему с оценками, надо отдавать себе отчёт, что на самом деле "радикальность" нашего голоса зависит не от нас -- она определена шкалой, которую нам предлагают выбирать. Если же мы используем разные шкалы, то такое голосование не отражает действительного мнения публики.

Второе, что говорит не в пользу текущего подхода -- это то, что он не передаёт сути происходящего (или усложняет её). Итог конкурса -- это рейтинг игр. Почему бы тогда не голосовать таким же образом: каждый для себя выстраивает игры в какой-то рейтинг, то есть показывает своим голосом, какую последовательность игр в финальном списке он бы хотел видеть. На мой взгляд, это более соответствует тому, что в реальности должен представлять голос игрока.


Метод Шульце

Метод Шульце -- это такой способ подсчёта голосов, в котором учитывается попарное расположение игр в рейтингах каждого голосующего. То есть не важно, насколько игра A лучше игры B у данного конкретного голосующего: важно лишь, как много людей согласны с тем, что игра A лучше игры B.
    Как несложно догадаться из формулировки, это сразу же решает проблему номер один: радикальность голоса не имеет значения -- для сильного изменения итогового рейтинга необходимо много одинаковых мнений, а не одно радикальное.
    Второе, что следует из той же формулировки -- это решение второй проблемы: здесь принципиально отсутствуют оценки, всё сводится к выстраиванию игр в определённый рейтинг. Сразу же оговорюсь, что рейтинг не означает отсутствие ничьих, то есть две или более игр можно оценить одинаково.

Несмотря на то, что этот метод кажется более подходящим в нашей ситуации, чем то, что мы используем сейчас, есть и некоторые нюансы, которые стоит упомянуть и обдумать.
    Метод Шульце успешно применяется на некоторых выборах в политических партиях, органах власти и организациях -- и это указывает на первый нюанс: цель этого метода -- выбрать одного победителя (хотя, конечно, он позволяет получить ранжированный список кандидатов). Действительно, если посмотреть на какие-то стандартные сервисы для голосования с использованием этого метода (например, этот), то окажется, что обязательно высказывать своё мнение по всем кандидатам.
    На упомянутом сайте не стали использовать интерфейс с распределением кандидатов в рейтинг, вместо этого там привычные оценки: от 1 до 5. При этом по умолчанию в бюллетенях уже проставлены единицы. Это можно понять в случае, когда надо выбрать одного лучшего: те кандидаты, про которых ничего не можешь сказать, точно не являются теми, кого хочешь выбрать -- поэтому они и получают минимальную оценку, то есть отправляются в конец рейтинга.


Возникает вопрос, можно ли применить тот же принцип в нашем случае. Сейчас происходит следующее: если человек не голосует за какую-то игру, то он фактически отдаёт ответственность за решение по поводу этой игры тем, кто за неё будет голосовать.
    Если взглянуть на листинги голосов с последнего КРИЛа, количество проголосовавших за игры варьируется от ~20 до ~40. Общее количество голосов составляет примерно 700. Однако же, если проставить баллы по умолчанию всем играм, то общее число голосов возрастёт вдвое.

 Инструментарий

Конечно, тут же приходит в голову идея не оперировать какими-то абстрактными ситуациями, а просто попробовать посчитать голоса разными способами -- и посмотреть, что из этого получается.
    Такая идея возникла почти одновременно сразу у нескольких людей: Olegus t.Gl. выложил свой вариант подсчёта голосов на форуме ifiction.ru, crem сделал возможность посчитать свои голоса [на 12.11.2019 ссылка не актуальна] через google spreadsheets. Я решил, что это хороший момент, чтобы познакомиться с javascript и сделать инструмент на этом сайте.
    Сразу хочу предупредить, что алгоритм не оптимизирован, и, временами всё считается долго (особенно для КРИЛ-2015), интерфейс выглядит простовато -- зато функционал позволил мне легко и без лишних усилий сравнивать разные голосования, подключить результаты КРИЛов разных лет и рассмотреть несколько интересных ситуаций. Сам инструмент доступен по этой ссылке.

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

Вот этот же листинг в формате, который берёт на вход мой инструмент:


Как оказалось, результаты совпадают: кандадат A -- лучший, кандидат C -- худший, B и D посередине с равными друг по отношению к другу общими голосами.
Насколько мне известно, такого рода ничьи можно разрешать по-разному, и это реализовано в инструменте crem'а и Olegus'а. Я не стал этого делать: лично я не вижу ничего страшного в том, что несколько игр заняли одно и то же место.

Проведя ещё пару сравнений с вышеуказанным онлайн-инструментом, я продолжил.

Дальше я решил посмотреть на голоса с КРИЛов. Enola нашла списки голосов со всех конкурсов, начиная с 2014 года -- и я вставил эти списки уже подготовленными в свой инструмент, чтобы можно было без труда поиграться с ними. Для последнего конкурса я вставил два списка: официальные голоса и все, включая забаненные. Это оказалось очень полезно, так как даёт наглядный пример того, что меняется, если использовать разные правила подсчёта голосов.


Сравнение "по среднему" и "по Шульце"

Итак, первое, что я сделал: сравнение итогового рейтинга при использовании среднего арифметического и метода Шульце, в обоих случаях отсутствие голоса означает отсутствие мнения ("не голосовал=не знаю").
Я взял все голоса, включая забаненные: мы знаем, что среди них много поклонников "Ради чашки супа", которые при подсчёте по среднему способствовали тому, что игра поднимается очень высоко, а, прежде всего, "Сказочный герой" и "Теория "Сказочного" градостроения", а также ряд других игр опускаются.

Вот итоговый рейтинг "по среднему":
 
Вот итоговый рейтинг "по Шульце":

По среднему "Ради чашки супа" на 6 месте, "Теория..." на 12, "...герой" на 17.

По Шульце "Ради чашки..." на 11 месте, "Теория..." на 12, "...герой" на 16.

Вот, что происходит, если сравнить оба метода для официально выбранных голосов:
По среднему:
 
По Шульце:
 
Как видно, здесь рейтинги довольно похожи (напомню, что в рейтинге по среднему первые четыре игры разделяли сотые). Таким образом, на этом примере можно увидеть, что использование метода Шульце нивелирует разницу между радикально голосующими и остальными.
    Если, например, какая-то группа людей вступит в сговор и будет голосовать за одну игру и против её конкурентов, эффект от их действий будет значительно меньшем при подсчёте голосов методом Шульце, чем при текущем использовании среднего арифметического. А, если учесть, что строго говоря, таких заговорщиков точно вычислить невозможно, использование метода Шульце может позволить принимать вообще все голоса, что, конечно, на мой взгляд, сделает голосование только справедливее.

Сравнение "не голосовал=не знаю" и "не голосовал=хуже всех" 

Второе, что интересно посмотреть, как влияет правило "не голосовал=хуже всех" на распределение голосов, если просто взять и применить его к текущим листингам.

Вот официально принятые голоса на КРИЛ-2018, подсчитанные методом Шульце по правилу "не голосовал=не знаю":
 
Вот то же самое, но с правилом "не голосовал=хуже всех":
 
Если посмотреть на листинги с учётом всех голосов, хорошо видно, как сильно влияют те, кто играет в малое количество игр. Вот голоса с "не голосовал=не знаю":
 
Вот то же самое, но с "не голосовал=хуже всех":
 
Как видно, любители "Ради чашки супа" (представляющие собой весомую часть забаненных голосов), которые чаще всего ставили оценки небольшому количеству игр, подняли все игры, за которые отдали хоть какие-то голоса, вверх по отношению к остальным. Напомню, чаще всего они голосовали хорошо за "Ради чашки..." и плохо за "Теорию..." и "...героя". То же касается и "Серости", которая получила много весьма противоречивых оценок -- но, как видно по рейтингу, важно, что их было много.
    Этот пример иллюстрирует, как сильно влияет на положение игры в таком случае хоть какая-то оценка. Это сразу же напомнило мне вопросы некоторых новичков, когда они не поняли, как именно будут подсчитываться голоса на КРИЛ-2018. Они тогда думали, что подсчёт осуществляется по сумме голосов, а не по среднему -- и считали, что лучше дать плохую оценку игре, чем никакую. Похоже, что введение опции "не голосовал=хуже всех" по своему действию перекликается с подсчётом по сумме голосов.
    Также интересно, что по приведённым только что рейтингам можно заметить и другой, обратный эффект: игры, за которые относительно мало голосовали, опустились вниз. Например, это касается "Саэски...", которая опустилась с первого места на 11.
    Кроме того, получается, что тот замечательный факт, что метод Шульце позволил "ограничить" влияние радикально голосующих игроков, теперь не имеет силы: с правилом "не голосовал=хуже всех" радикально голосующие (только теперь это те, кто отдаёт мало голосов играм) очень сильно влияют на итоговый рейтинг.

Популярное и лучшее

Как видно, при системе "не голосовал=хуже всех" наравне с качеством оценки встаёт и её наличие -- и игры, в которые много играют (пускай, они и не нравятся половине игроков) попадают наверх списка. А игры, популярные лишь у части сообщества, но высоко оценённые ей, оказываются в середине.
    С другой стороны, при системе "не голосовал=не знаю" происходит обратная картина: наверху оказывается игра, в которую, может, сыграло не так много людей (26 из 68 голосов, если считать полный список), но которой единодушно отдали высокие оценки -- а популярные, но спорные игры, оказались в середине.
    Замечу на всякий случай, что игры, придерживающиеся золотой середины, в обоих случаях оказываются наверху.

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

Для меня лично этот вопрос стоит в несколько другой плоскости: я не знаю, какая игра должна побеждать на КРИЛе. Но я точно знаю, что, как игрок, хочу иметь выбор. И сейчас у меня этот выбор есть: я могу поставить всем играм, в которые не играл, самую низкую оценку, а могу их просто не оценивать, тем самым доверив высказаться на их счёт другим. И эти же возможности у меня как игрока сохраняются, если применить "не голосовал=не знаю". Если же использовать "не голосовал=хуже всех", у меня забирают возможность, лишают выбора -- но взамен никаких новых прав не дают. А я люблю, когда есть выбор.

Комментариев нет:

Отправить комментарий