Я прочитал Википедию о Smith Set, Набор Шварца, Алгоритм Косараджу, Алгоритм Тарьяна и алгоритмы с сильными компонентами на основе пути; однако мой опыт работы с такими алгоритмами… недостаточен. В Википедии также говорится, что вы можете использовать версию алгоритма Косараджу для создания множества Шварца, и что эти алгоритмы могут вычислять множество Смита.
В Википедии также есть некоторый псевдокод для алгоритма Тарьяна, но не для других; и это не относится к этому относительно чувствительному приложению. Я также не уверен на 100 %, что реализовать проще всего, что имеет свойство наименьшей вероятности ошибок при реализации.
Я хотел бы получить более прямой псевдокод для вычисления набора Смита и Шварца с помощью одного из этих алгоритмов с учетом набора ранжированных бюллетеней. Мне легче понять концепции, когда у меня есть практический процесс, по которому я могу идти. Я сам превращу его в настоящий код.
Рассмотрим следующую структуру данных:
Type Ballot {
Array Votes[] {
Candidate Candidate; // We do this in C#
int Rank;
}
}
Для набора бюллетеней каждый отдельный бюллетень будет содержать массив голосов, например следующий:
Ballot b.Votes[] =
[ Vote(Alex.ID, 1),
Vote(Chris.ID, 3),
Vote(Sam.ID, 2) ];
Это соответствует избирателю, выбравшему Alex>Sam>Chris
, и могут быть другие кандидаты, которые одинаково менее предпочтительны, чем Крис.
Я предполагаю, что первым шагом будет подсчет отдельных голосов и построение графика победы. Например: если 100 избирателей ставят Алекса выше Сэма (Алекс = 1, Сэм >= 2), а 50 избирателей ставят Сэма выше Алекса, Алекс побеждает Сэма. Таким образом, я предполагаю, что будет структура данных как таковая:
Type GraphNode {
Candidate Candidate;
GraphNode Array Defeats[];
GraphNode Array Ties[];
GraphNode Array DefeatedBy[];
}
Таким образом, GraphNode для Алекса будет иметь элемент в Defeats[]
, указывающий на GraphNode для Сэма, и наоборот.
Учитывая эти GraphNodes, что мне делать с ними, чтобы идентифицировать множества Смита и Шварца?
Заранее спасибо.